24

Mam 3 segues do 3 różnych widoków. 2 są realizowane bez problemu, to jest, gdy trzeci jest tworzony, że problemy występują.prepareForSegue wywoływane przed didSelectRowAtIndexPath dopiero po dodaniu trzeciej zmiany

Mam następujący sposób didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@" ---------- did select row"); 

    if(indexPath.section == 0){ 
     if(indexPath.row == [self.data count]-1){ 
      //prior to adding this, everything works 
      [self performSegueWithIdentifier:@"MoreComments" sender:self]; 
     }else{ 
      [self performSegueWithIdentifier:@"FriendView" sender:friend]; 
     } 
    }else if(indexPath.section == 1){ 
     if(indexPath.row == [self.data2 count]-1){ 
      [self performSegueWithIdentifier:@"MorePosts" sender:self]; 
     }else{ 
      [self performSegueWithIdentifier:@"FriendView" sender:friend]; 
     } 
    } 
} 

Mam następujący sposób prepareForSeque:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"MorePosts"]){ 
     MorePostsViewController *mfamvc = segue.destinationViewController; 
     mfamvc.data = self.data; 
    }else if([segue.identifier isEqualToString:@"FriendView"]){ 
     FriendViewController *fvc = segue.destinationViewController; 
     fvc.friend = friend; 
    }else if([segue.identifier isEqualToString:@"MoreComments"]){ 
      MoreCommentsViewController *mcvc = segue.destinationViewController; 
      mcvc.data = self.data2; 
    } 
} 

Przed kontrolą przeciąganie z celi do ostatniego widzenia widzę, że mój program uderza didselectrow a następnie przygotować forseque. To sprawia, że ​​cała nawigacja widoku działa idealnie.

Jak tylko kontrolować opór od celi do MoreCommentsViewController zaczynam widzieć błąd:

zagnieżdżona animacja Push może spowodować uszkodzenia paska nawigacyjnego Kończąc przejścia nawigacji w nieoczekiwany stan. Drzewo podglądu paska nawigacji może zostać uszkodzone.

Zauważyłem, że teraz również dwa razy są wywoływane przygotowanie, a przygotowanie jest nazywane pierwszym, a następnie zaznaczone, a następnie przygotuj ponownie.

Co robię źle, aby warunkowo przejść do tych różnych poglądów?

+0

Coś jest chyba nie tak z względami segues podłączonych do góry. Czy możesz opisać, co zrobiłeś w IB lub opublikować link do obrazu z Twojego storyboardu? Czy łączysz wiele segues bezpośrednio z jednego prototypu komórki? Jeśli tak, to jest coś nie tak. – rdelmar

+0

Tak, łączę wiele seguesów z jednego prototypu komórki. Domyślam się, że to jest problem. – Atma

Odpowiedz

2

Powód jest taki, że nie można przeciągać z komórki widoku tabeli do wielu widoków. Jak powiedział @rdelmar, to jest złe. Powinieneś przeciągnąć od miejsca docelowego do widoku źródłowego, a następnie obsługiwać ręcznie tak, jak to zrobiłem powyżej.

Również można znaleźć tutaj: Conditional segue performed on tap on UITableViewCell

+0

Ponadto, jeśli używasz 'didSelectRowAtIndexPath' do warunkowego przejścia do jednej z kilku możliwych scen docelowych, te sekcje powinny _nie_ pochodzić z prototypu komórki kontrolera źródłowego, ale raczej powinien pochodzić z ikony kontrolera widoku pod sceną. Jeśli masz segue z komórki, a także 'didSelectRowAtIndexPath', która wywołuje segues, w końcu będziesz wywoływał _two_ segues, co oczywiście nie jest zgodne z zamierzeniem. – Rob

70

Powinieneś użyć albo didSelectRowAtIndexPath, albo segues z komórki, ale nie obu. Jeśli chcesz, aby didSelectRowAtIndexPath do wywołują segues te segues powinny nie być z komórki do następnej sceny, ale raczej z ikoną widok kontrolera w pasku nad sceną:

segue between view controllers

Można teraz wybierz tę nową segue, przejdź do „przypisuje inspektora” (opcji + komenda +) i dostarczyć identyfikator storyboard, które można odwoływać się w kodzie podczas rozmowy performSegueWithIdentifier.

+1

Dzięki, to ma sens. – MQoder

+0

Jak uzyskać obiekt docelowyViewController za pomocą tej metody? – rigdonmr

+0

@rigdonmr - bez względu na to, czy dodałeś segue w konstruktorze interfejsów, czy też programowo nazwałeś 'performSegueWithIdentifier' w' didSelectRowAtIndexPath', tak czy inaczej, zostanie wywołana funkcja 'prepareForSegue', a następnie można odwołać się tam do' sortue.destinationViewController'. – Rob

Powiązane problemy