2013-11-27 31 views
7

İçinde farklı tablo görünümü hücreleriyle bir tablo görünümü var. Hücrelerden birinde, basıldığında bir görüntü denetleyicisini yükleyen iki düğme vardır. Ben butonuna basarken işlemek için aşağıdaki işlevi kullanıyorum:iOS segue iki kez çalıştırıldı

- (IBAction)leftButtonPressed:(id)sender 
{ 
    // Getting the pressed button 
    UIButton *button = (UIButton*)sender; 
    // Getting the indexpath 
    NSIndexPath *indPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; 
    // Loading the proper data from my datasource 
    NSArray *clickedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indPath.row]; 
    [[SOEventManager sharedEventManager] setSelectedEvent:clickedEvent[0]]; 
    // Everything working as it should up to this point 
    // Performing seque... 
    [self performSegueWithIdentifier:@"buttonSegue" sender:self]; 
} 

Benim buttonSegue yeni bir görünüm denetleyicisi itmek gerekiyordu. Bir şekilde yerine kez iterek, iki kez bastırıyor gibi görünüyor, bu yüzden aşağıdaki uyarıyı alıyorum: Benim durumumda

2013-11-27 01:48:30.894 Self-Ordering App[2081:70b] nested push animation can result in corrupted navigation bar 
2013-11-27 01:48:31.570 Self-Ordering App[2081:70b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 

Ben uygulamanın hemen pop istediğiniz bir etkinlik olduğundan o çökmesine yol açan Görünüm denetleyicisi böylece tablo görünümüne geri dönün. Bunun için bir alertview kullanmak ve aşağıdaki olay işlemek: Beni ilginç benim "normal" tablo görünümü hücresinden bir diğer segue olduğunu not etmek olabilir

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex]; 
    // ... 
    // Additional checking of button titles.... 
    else if ([buttonTitle isEqualToString:NSLocalizedString(@"Vissza", nil)]) 
    { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
} 

ve bu durumda ben prepareForSegue kullanmak : yöntem

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"detailSegue"]) 
    { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     SOEvent *selectedEvent = [[[SOEventManager sharedEventManager] eventsArray] objectAtIndex:indexPath.row]; 
     [[SOEventManager sharedEventManager] setSelectedEvent:selectedEvent]; 
    } 
} 

Bu durumda, denetleyici mükemmel bir şekilde itilir ve gerekirse hemen atılır. Bunu iOS7 ve Xcode 5'de test ediyorum. Daha önce hiç böyle bir problemle karşılaşmadım, herhangi bir yardım çok takdir edilecektir.

+5

Arabirim oluşturucuda eylemleri doğru şekilde bağladığınızdan emin misiniz? Belki de olayı, her ikisi de içeriye değmek yerine içeriye değin ve içeriye değmek yerine içeriye dokundun. ya da belki de her iki koddan segue atamadım ve tekrar arayüz oluşturucuda. Onları kontrol ettin mi? Bu yaygın bir hatadır. –

+0

Oh lanet olsun .. Aslında haklısınız, düğmelerimi de tablo görünümü veri kaynağı yöntemlerine atadım. Cevabınız için teşekkür ederiz! –

cevap

16

tarafından cevap Poyrazoğlu edebilirsiniz:

da doğru arayüz oluşturucudaki eylemlerini kablolu ettik emin misin? Belki de olayı, her ikisi de içine dokundunuz ve içeriye dokunmak yerine içeriye dokundunuz. ya da belki de adresinde, hem koddan hem de arabirim oluşturucusundan gelen segue atanmış olabilirsiniz. Onları kontrol ettiniz mi? Bu yaygın bir hatadır. -

Her bir düğme için, hem storyboard hem de tableview'ın veri kaynağı yöntemlerinde bulunan touch up eylemlerini atadım.

Hızlı yardımınız için teşekkürler poyrazoğlu !!

+0

oh, ben gerçekten masa görünümü hakkında düşünmedim, ama yardımcı görmekten memnun oldum. Hoş Geldiniz :) –

+0

Yeni görüntü denetleyicisini 2x de yüklüyordum. Segue'i tablo denetleyicisi yerine görünüm denetleyicisinden bağladım ve bu sorunu çözdüm. – JeffK

12

Belki de önerilerinizi UIButtons yerine Görünüm Denetleyicileri ile bağlamak istiyorsunuz!

Muhtemelen Segues bu gibi bazı düğmesi ile kablolu olmalıydı

: enter image description here

Ama bunun yerine görünüm denetleyicileri ile bunları tel olmalıdır: enter image description here

+0

Bu benim için çalıştı! (Swift 4, Xcode 9). Bunun neden daha fazla vurgulanmadığından emin değil! Bir delege kullanarak, segue bir düğme (bir masa hücresinde) arasında kablolanmışsa, her zaman ateşlenir ve delege bundan sonra yürütülür. Hücre görüntüsüne kablolu, bu gerçekleşmez, bu yüzden segue yapmak için el ile yapılan çağrı planlandığı gibi çalışır. – DavidG

1

Ben varken hep bu sorunu olsun düğmelerim doğrudan hedef görüntü denetleyicisine bağlandı. Yaptığınız eski segue'yi ilk önce silmeniz, sonra mevcut görüntü denetleyicisini (nereden geliyorsunuz) ve CTRL + hedef denetleyiciye tıkladığınızdan emin olmanız gerekir.

Bu düzeltmek gerekir :)

5

kullanıyorum ne Swift 3, xcode ve IOS 9+ için: Eğer UIViewControllers değil düğmeleri veya diğer arayüzleri gelen segue çizim emin olun.

Aynı sorunu yaşadım ve basitçe düğmenin başlangıcını düğme yerine UIController'den değiştirerek bu hatayı kaldırdım.