2011-12-17 7 views
6

Il mio problema sembra un problema generico, ma non riesco a trovare una risposta.Condizionale Segue la navigazione da UITableViewCell in base alla risposta a UIAlertView

Ho una situazione in cui quando l'utente tocca un UITableViewCell personalizzato, vorrei visualizzare un avviso e quindi in base alla risposta all'avviso, rimanere sulla stessa vista (l'utente che seleziona annulla) o visualizzare un'altra vista (se l'utente seleziona procedi). E mi piacerebbe farlo usando la funzione storyboard & segues.

Come si fa a fare questo? Devi fare questo alla vecchia maniera?

risposta

11

@user, crea l'avviso Visualizza la vecchia maniera; So di qualsiasi funzione di storyboard per farlo in modo diverso. Dove lo storyboard può aiutare è con i segues. Puoi chiamare i segues a livello di programmazione. Con il pulsante di visualizzazione della vista di avviso si può solo tornare (cioè non fare nulla). Per l'altra opzione, per visualizzare un'altra vista, è possibile chiamare a livello di codice un seguito per passare alla vista desiderata. Se non hai il percorso corretto già definito per qualche altro motivo nello storyboard, basta creare un pulsante e usarlo per creare il seguito e nominarlo. Assegna un nome al seguito facendo clic su di esso nello storyboard e utilizza l'ispettore di attributi per assegnargli il nome (identificatore). Quindi nascondi il pulsante o mettilo fuori dalla vista. Generalmente inserisco questo tipo di pulsante sulla barra degli strumenti e utilizzo gli spaziatori per tenerli fuori dalla vista. Ecco alcuni esempi di codice:

Chiamare la segue dal punto di vista avviso delegato in questo modo:

[self performSegueWithIdentifier: @"done" sender: self]; 

implementare anche questo metodo per fare qualsiasi compito necessario per preparare l'segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     // [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
     // [[segue destinationViewController] setSelectedClient:selectedClient]; 
    } 
} 
+1

questo è quello che ho fatto; mi è sembrato un tale trucco, ho pensato che c'era un modo più ovvio che avevo trascurato. –

+1

@user, se tu o chiunque altro leggendo questo si scopre un modo migliore per farcelo sapere. –

8

È può creare follower direttamente da startViewController a più DestinationViewControllers che possono quindi essere "eseguiti" a livello di programmazione. Non è necessario creare alcun pulsante nascosto per loro, che sembra un trucco.

+0

+1, ma come si creano segues direttamente da startViewController a più DestinationViewControllers? Intendi solo trascinare Ctrl tra i controller della vista e nominare i segues? – brainjam

+1

Sì, volevo dire che basta semplicemente tenere premuto il tasto Ctrl tra i controller della vista. Il punto principale è che non si seleziona un elemento del controller della vista all'interno di una visualizzazione dello storyboard, ma si seleziona il controllore stesso della vista e si trascina Ctrl sulle altre visualizzazioni. L'ho fatto da solo e ha funzionato bene. – DataJock

+0

Bello! Niente più pulsanti fantasma per me. –

4

OK. Mi è venuta una soluzione in linea con lo storyboard che mi piace.

Esempio:

mia Tableview ha 2 sezioni, raggruppate, e le cellule sono prototipo dinamico. La sezione 0 contiene una riga/UITableViewCell & Non voglio che segua. Sezione 1 contiene più celle che voglio attivare il seguito & drill down nel dettaglio.

In Storyboard:

  • ho rimosso la segue che collega il tableviewcell al controller della vista di destinazione.
  • Ho effettuato una procedura "generica" ​​che collega il controller della vista sorgente direttamente al controller della vista di destinazione.
  • Negli attributi del seguito, ho impostato l'identificatore ('EditTimePeriod') e impostato il tipo su Push (presumo che Modal possa funzionare allo stesso modo).

Nel regolatore di vista di origine:

  • Nel metodo prepareForSegue ho gestito sia la segue comune 'AddTimePeriod' Io controllo-trascinato dal mio UIBarButtonItem (Add), insieme con la 'generica' (vc -> vc) "EditTimePeriod" segue.

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        // handle the click of the 'Add' bar button item  
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         // database & entity stuff for adding the new one to the mOC, etc 
        } 
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
         tpvc.timePeriod = newTP; 
        } 
    } 
    
  • Poi ho implementato il tableView: Metodo didSelectRowAtIndexPath, e mettere la mia condizione qui. Se la riga selezionata era fuori sezione a zero ho chiamato la segue EditTimePeriod manualmente, definendo il mittente come tableviewcell selezionato:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        if(self.tableView.indexPathForSelectedRow.section!=0){ 
         [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]]; 
        } 
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    
        return;  
    } 
    

sarebbe bello codificare la cella in sezione 0 in modo che non è selezionabile innanzitutto! Spero che questo aiuti però.

** e poi 5 minuti dopo ho dato un'altra occhiata e ho realizzato che potevo semplicemente spostare i dati dalla sezione 0 nell'intestazione della sezione, che è più intuitiva e non veniva comunque utilizzata. lasciando il disegno aperto per un seguito standard da ogni tableviewcell senza aver bisogno di alcuna condizione/controllo. Era comunque un buon esercizio :)