24

Ho 3 passaggi per 3 visualizzazioni differenti. 2 sono implementati senza problemi, è quando viene creato il terzo che si verificano i problemi.prepareForSegue chiamato prima di DoesSelectRowAtIndexPath solo quando viene aggiunto il terzo passaggio

ho il seguente metodo 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]; 
     } 
    } 
} 

ho il seguente metodo 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; 
    } 
} 

Prima di controllo trascinare dalla mia cella per l'ultima vista posso vedere che il mio programma colpisce didselectrow e poi preparatevi a fare. Ciò rende perfetta la navigazione della vista.

Appena ho controllo di trascinamento dalla mia cella alla MoreCommentsViewController comincio a vedere l'errore:

nidificato animazione spinta può causare danneggiato barra di navigazione Finendo una transizione di navigazione in uno stato imprevisto. L'albero secondario della barra di navigazione potrebbe essere danneggiato.

Mi accorgo che ora anche preparareforseque viene chiamato due volte, con la preparazioneforseque che viene chiamata per prima, quindi viene eseguita una volta, quindi preparata nuovamente.

Cosa sto sbagliando per andare condizionatamente a queste diverse visioni?

+0

Qualcosa è probabilmente sbagliato con i modi i segues sono collegati in su. Puoi descrivere cosa hai fatto in IB o postare un link ad un'immagine del tuo storyboard? Stai collegando più folletti direttamente da un prototipo di cella? Se è così, è ciò che è sbagliato. – rdelmar

+0

sì, sto collegando più folletti da un prototipo di cella. Immagino che questo sia il problema – Atma

risposta

2

Il motivo è che non è possibile trascinare da una cella tableview a più viste. Come @rdelmar ha detto che questo è sbagliato. Dovresti trascinare dalla destinazione alla vista sorgente e poi gestirla manualmente come ho fatto sopra.

Inoltre può essere trovato qui: Conditional segue performed on tap on UITableViewCell

+0

Inoltre, se stai usando 'didSelectRowAtIndexPath' per seguire in modo condizionale uno dei possibili scenari di destinazione, quei segues dovrebbero _non_ provenire dal prototipo di cella del controller sorgente, ma piuttosto dovrebbe invece provenire dall'icona del controller della vista sotto la scena. Se hai passaggi dalla cella e un 'didSelectRowAtIndexPath' che richiama segues, finirai per invocare _two_ segues, che chiaramente non è ciò che è inteso. – Rob

70

È necessario utilizzare didSelectRowAtIndexPath o passa dalla cella, ma non entrambi. Se volete che i vostri didSelectRowAtIndexPath per richiamare segues, quelle segues dovrebbero non essere dalla cella alla scena successiva, ma piuttosto dall'icona View Controller nella barra sopra la scena:

segue between view controllers

ora è possibile selezionare questa nuova segue, andare alla sezione "attributi" (opzione + comando +), e fornire un identificatore storyboard che è possibile fare riferimento nel codice quando si chiama performSegueWithIdentifier.

+1

Grazie, ha senso. – MQoder

+0

Come si ottiene destinationController con questo metodo? – rigdonmr

+0

@rigdonmr: se hai aggiunto un seguito nel generatore di interfacce, o hai programmaticamente chiamato 'performSegueWithIdentifier' in' didSelectRowAtIndexPath', in entrambi i casi, viene chiamato 'prepareForSegue', e puoi quindi fare riferimento a' segue.destinationViewController '. – Rob

Problemi correlati