2011-10-30 3 views
39

Sto lavorando su alcuni progetti per iOS 5 utilizzando Xcode 4.2. Ho un UITableViewController e voglio eseguire un seguito quando l'utente tocca la cella della tabella, ma il controller della vista di destinazione dipende dall'azione eseguita su quella cella. Ad esempio, quando l'utente tocca la cella, vorrei caricare SomeViewController, ma quando l'utente tocca la stessa cella in modalità di modifica vorrei caricare AnotherViewController. Sfortunatamente, non c'è modo di configurare più segui sulla stessa cella nello sviluppatore di storyboard Xcode 4.2, o semplicemente non capisco. Forse c'è un modo per creare i passaggi a mano, nell'editor di codice. In generale, ciò che voglio ottenere è fornire all'utente un modo per "inserire" l'elemento rappresentato da una cella utilizzando un controller di visualizzazione e "modificare" l'elemento rappresentato dalla stessa cella utilizzando un altro controller di visualizzazione. Passare al secondo controller di visualizzazione (editor) solo in table-edit-mode è stato il mio primo pensiero, ma forse c'è un modo migliore. Qualsiasi aiuto sarà apprezzato.Seguito condizionale eseguito alla pressione su UITableViewCell

+2

Ho appena capito. È semplice e può essere fatto usando l'editor storyboard Xcode. Ho aggiunto due follower al mio TableViewController che punta a diversi controller di visualizzazione, e sto attivando uno corretto dal codice quando l'utente seleziona una cella, e a seconda che sia fatto in modalità di modifica o meno - Sto attivando il seguito appropriato. In precedenza ho cercato di aggiungere più sequenze alla stessa strega delle cellule non è possibile. – Darrarski

+3

Sarebbe bello se avessi elaborato questo in una risposta, mostrando esattamente come imposti i segui. – JohnMerlino

+0

Sto affrontando lo stesso problema, ho due controller di visualizzazione di destinazione con segues dalla sorgente ma non so come attivare specifici passaggi ??? – Bear

risposta

53

Mentre guardi Storyboard, trascina il controllo dalla tua sorgente Visualizza controller al controller della vista Destinazione. Questo creerà un seguito che puoi attivare a livello di codice direttamente dalla tua sorgente View Controller. Assicurati di darti un nome per Segue. Questo nome è ciò che si passerà nel sistema di esecuzione ViewSegue: withIdentifier: method.

+5

Il bit che spesso si perde nelle risposte che ho visto a questa domanda è come rilevare il tocco che normalmente fa scattare il continua ora che lo hai staccato dalla cella. La risposta è implementare 'tableView: didSelectRowAtIndexPath:' nel tuo UITableViewController - anche se è una tabella statica. Nel corpo per quel metodo, si inserisce il codice condizionale e si chiama 'performSegue: withIdentifier:' quando le condizioni sono corrette – Rhubarb

+0

Il punto è che è possibile impostare più di un passaggio da una cella prototipo tableView. Basta dare loro degli identificatori distinti. In questo modo in didSelectRowAtIndexPath: puoi impostare una condizione se ([self.tableview isEditing]) e causare il seguito nell'uso dell'identificatore impostato. – smileBot

33

Sto aggiungendo una risposta in più solo perché dopo aver letto quello selezionato in alto in molti altri posti - e è la risposta corretta - Mi sono ritrovato a chiedermi come rilevare il tocco che normalmente si innesca nel seguito . Vedete, se create i vostri passi nel solito modo trascinando il tasto CTRL dalla cella della vista tabella al prossimo controller, allora due cose vengono fatte automaticamente.

  1. il tocco nella cella viene rilevato
  2. la segue viene effettuata

ma, naturalmente, non si può bloccare la segue.

Ora, se si vuole condizionale segue, poi (come detto in altre risposte)

si elimina che segue e creare uno nuovo dal UITableViewController (trascinarlo dagli oggetti navigator piuttosto che la storyboard) per la prossima controller - e dargli un nome.

Quindi - e questa è la parte che mancavo - attuare tableView:didSelectRowAtIndexPath nel controller di visualizzazione tabella per eseguire i passaggi a livello di programmazione e condizionale, come di seguito.

Nota che devi anche identificare la tua cella in qualche modo in modo da sapere se quella che ti interessa è stata selezionata. Puoi farlo conoscendo il percorso dell'indice in una tabella statica, ma preferisco impostare l'identificatore univoco delle mie celle in IB (anche se non ne ho bisogno per dequeueing dato che si tratta di una tabella statica) e controllarlo. In questo modo se sposto la mia cella su o giù nella tabella statica, non avrò bisogno di cambiare questo codice.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Find the selected cell in the usual way 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Check if this is the cell I want to segue from by using the reuseIdenifier 
    // which I set in the "Identifier" field in Interface Builder 
    if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) { 

    // Do my conditional logic - this was the whole point of changing the segue 
    if (myConditionForSegueIsSatisfied) { 
     // Perform the segue using the identifier I was careful to give it in IB 
     // Note I'm sending the cell as the sender because that's what the normal 
     // segue does and I already had code counting on that 
     [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell]; 
    } 
} 

noti come mando la cella con il segue - la segue normale dalla cella lo fa, e mi aveva inizialmente passato pari a zero, e il mio codice che era dipeso ha smesso di funzionare.

+0

Questo ha fatto ciò di cui avevo bisogno. Grazie – Critter

+0

Cancellare la sequenza, e riaggiungere è stata la chiave - se si è utilizzato il modello dettagli principali per creare il progetto. Grazie. – Stiefel

+0

Trascinalo da UITableViewController! Era così ... Mi chiedevo come (non programmaticamente) creare un seguito che non era collegato a una vista specifica. – maganap

5

Questa è una vecchia questione e alcune grandi risposte corrette ma vi posterò alcune informazioni aggiuntive mi sentivo utile quando ho incontrato questo:

  1. Se si crea un segue nella storyboard CTL + trascinare da SomeVC a AnotherVC, cancellarlo.

  2. Nel navigatore oggetti, ctl + trascina a livello ViewController (di solito prima nella gerarchia sotto il nome del VC) da SomeVC a AnotherVC. Dai al seguito un identificatore univoco.

  3. Implementare tableView: didSelectRowAtIndexPath: come descritto sopra.

  4. ho trovato utile usare una dichiarazione switch in tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) { 
    case 0: 
        [self performSegueWithIdentifier:@"yourIDHere" sender:self]; 
        break; 
    case 1: 
        // enter conditional code here... 
        break; 
    case 2: 
        // enter conditional code here... 
        break; 
    // ... for however many cells you require 
    
    default: 
        break; 
    

    }

Grazie per le grandi risposte a tutti.

0

Si può facilmente controllare l'apertura di qualsiasi segue nella vostra abitudine UIViewController attuando

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }