2012-04-17 3 views
5

Ho una piccola app che utilizza più layout di sezione per la vista tabella iniziale. Una sezione mostra le tendenze più recenti da Twitter e l'altra sezione mostra le storie più recenti da Twitter. Quando faccio clic su un elemento all'interno dell'elenco delle tendenze, passo a un nuovo controller di visualizzazione tabella che mostra i tweet più recenti su tale tendenza. All'interno del controller di root per la sezione di storie I wat può essere in grado di visualizzare più informazioni in un controller di visualizzazione diverso che contiene immagini, collegamenti e così via. Il problema è che quando seleziono qualcosa all'interno della sezione delle storie, sono spinto al controller di visualizzazione tabella che è impostato per la sezione tendenze. Ho chiamato ogni segue e hanno classi personalizzate per entrambi i punti di vista che voglio transizione verso e sto facendo questo per verificare che segue viene chiamato:Seguiti multipli dal controller di visualizzazione tabella

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if([[segue identifier] isEqualToString:@"viewTrendsSearch"]) { 

     //get the controller that we are going to segue to 
     SearchTrendResultsViewController *strvc = [segue destinationViewController]; 

     //get the path of the row that we want from the table view 
     NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 

     //here we get the trend object from the array we set up earlier to hold all trends 
     Trends *results = [currentTrends objectAtIndex:[path row]]; 

     //pass the object that was selected in the table view to the destination view 
     [strvc setQuery: results]; 
    } 

    if([[segue identifier] isEqualToString:@"storyfullDetails"]) { 

     StoriesViewController *svc = [segue destinationViewController]; 

     NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 

     Stories *results = [currentStories objectAtIndex:[path row]]; 

     [svc setStory:results]; 
    } 
} 

Tutti i suggerimenti su come raggiungere i diversi punti di vista ?

risposta

16

Non ci sono abbastanza informazioni nella tua domanda per essere sicuri, ma questo suona come un problema con ciò che chiamerei successi automatici o manuali e le restrizioni su ciascuno.

Un automatico segue viene creato in IB trascinando da una cella di tabella (prototipo) o un altro controllo. La cosa bella è che è, beh, automatico: toccando il controllo si esegue il seguito e tutto ciò che devi fare nel codice è implementare prepareForSegue:sender: in modo che il controller della vista di destinazione ottenga i dati corretti. Lo svantaggio è che qualsiasi controllo dato (incluse le celle del prototipo) può avere solo un movimento in uscita (altrimenti lo storyboard non saprebbe quale eseguire automaticamente).

Un manuale segue creata IB trascinando dalla sorgente vista del regolatore. Il vantaggio di questo è che un controller di visualizzazione può avere più folletti in uscita. D'altra parte, non sono associati a un controllo intercettabile, quindi è necessario implementare la logica che determina quale eseguire quando (e chiama performSegueWithIdentifier: per farlo accadere).

A fronte di tali compromessi, ci sono due possibili soluzioni al problema:

  1. Utilizzare le celle della tabella prototipo multipla - poi ognuno può avere il proprio segue automatica in uscita. Dovrai modificare il tableView:cellForRowAtIndexPath: del controller di visualizzazione tabella per controllare il numero di sezione del percorso dell'indice e scegliere l'identificatore appropriato per dequeueReusableCellWithIdentifier:, ma questo potrebbe rendere le cose più convenienti o efficienti se le tue celle di tendenza e di storie hanno comunque contenuti diversi.

  2. Utilizzare manuali segues. Quindi il tuo controller di visualizzazione tabella può implementare tableView:didSelectRowAtIndexPath: per chiamare performSegueWithIdentifier: con l'identificatore appropriato scelto in base alla sezione del percorso dell'indice.

In entrambi i casi, l'implementazione di prepareForSegue:sender: sembra soddisfacente.

+0

Ok, grazie! Analizzerò ulteriormente queste due opzioni e vedrò se posso andare avanti. Per quanto riguarda la soluzione 1, come implementeresti più celle di tabella prototipo? Nell'interfaccia dello storyboard, dovresti semplicemente trascinare un altro controller di visualizzazione tabella sul controller principale? – swallace

+0

Selezionare la vista tabella in IB e l'ispettore attributi avrà controlli per il numero di celle prototipo. Oppure trascina un UITableViewCell dalla libreria nella tabella. In ogni caso, assicurati di selezionare ogni cella e assegnagli un identificatore univoco. – rickster

+0

Ottima spiegazione. Mi ha aiutato a capire meglio cosa sta succedendo – Andrew