2012-01-10 12 views
10

Sto iniziando ora con Xcode su 4.2 per iOS5 e ci sono alcune modifiche e sto attraversando un problema che non riesco a capire come risolverlo .Xcode 4.2 iOS 5: segui multipli da UITableView

Sto facendo un esempio con un UITablwView che viene popolato programmaticamente con 2 sezioni, 1a sezione con solo 1 riga e 2a sezione con 3 righe.

Il mio obiettivo è selezionare una riga dalla tabella e, in base a tale riga, l'utente verrà reindirizzato a diverse viste.

Ad esempio: sezione di selezione 0 riga 0, app spinge per visualizzare 1 - impostazione nome // sezione di selezione 1 riga 0, app spinge per visualizzare 3 - modificando

La vecchia maniera indirizzo, questo è abbastanza semplice, solo bisogno di avviare un UIViewController con initWithNibName e quindi premere la vista.

Ora con StoryBoard cambia tutto, o almeno penso che cambi perché non riesco a vedere come ottenere lo stesso risultato dato che non posso impostare più passaggi da tableView a diversi UIViewControllers ... e fare Nel vecchio modo, non riesco a vedere dove posso ottenere i nomi NIB dalle viste di StoryBoard per avviare un UIViewController da spingere.

Qualcuno sa come arrivare a questo risultato ??

risposta

25

Definire due segui "generici" (identificati come "segue1" e "segue2", ad esempio) nello storyboard dal controller di visualizzazione sorgente, uno a ciascun controller di visualizzazione di destinazione. Questi segui non saranno associati ad alcuna azione.

Poi, eseguire condizionalmente i segues nel UITableViewDelegate:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Conditionally perform segues, here is an example: 
    if (indexPath.row == 0) 
    { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } 
    else 
    { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 
+2

Fantastic risposta. Funziona anche per me. Dovrebbe essere accettato come risposta. – mm24

16

Ho lo stesso problema, come si fa. Il problema è che non è possibile collegare il tuo tavoloViewCell tableViewCell a più controller di visualizzazione. Tuttavia è possibile collegare la propria vista sorgente a a più controller di visualizzazione.

  1. di controllo e trascinare il maestro View Controller (al posto del tavolo delle cellule vista) dal visualizzatore scena a qualsiasi controller della vista che si desidera collegare. Puoi farlo quanto vuoi. Si noti che il seguito mostrato nella scena del controller della vista sorgente dovrebbe essere qualcosa come "Push Segue da Root View Controller ..." invece di "Push Segue da NavCell a ...".

  2. Identificare ogni link segue un nome univoco come "toDetailView1"

  3. Infine, su misura la selezione nella vista controller di origine:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        if (indexPath.row % 2 == 1) { 
         [self performSegueWithIdentifier:@"toDetailView1" sender:self]; 
        } else { 
         [self performSegueWithIdentifier:@"toDetailView2" sender:self]; 
        } 
    } 
    
+0

+1 risolto il mio problema –

+0

Incredibile! Risolto il mio problema! Una domanda ... Come posso usare la stessa cosa per più di due segues. Diciamo che ho 7 celle TableView. Come dovrei usarlo oltre al codice che hai fornito? –

0

Come @ 陳仁 乾 e @Marco spiegato era completamente corretto. Per rendere tutto un po 'più semplice, ti consiglio di utilizzare un singolo NSArray che verrà inizializzato quando viewDidLoad.Basta nominare i segues lo stesso del vostro UIViewControllers, in questo modo è possibile visualizzare una corretta descrizione di ciò che UIViewControllers si può scegliere e si può anche eseguire la segues da questa NSArray:

(In realtà io non sono sicuro se si può causare problemi chiamando la segue lo stesso del UIViewController che si desidera chiamare. per favore fatemi sapere se questo è BadPractise)

viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _arraySessions = [[NSArray alloc] initWithObjects: 
         @"MyViewControllerName", nil]; 
} 

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"overviewCell" 
            forIndexPath:indexPath]; 

    [cell.textLabel setText:_arraySessions[indexPath.row]]; 

    return cell; 
} 

didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView 
     didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [self performSegueWithIdentifier:_arraySessions[indexPath.row] 
           sender:self]; 
}