2012-01-19 4 views
16

Non riesco a ottenere questo SIGABRT che continuo a ricevere. Ho questa applicazione iOS per lo storyboard, e nello storyboard ho un UITableViewController. Ora, posso prendere una cella di TVC e farla spingere il controller di visualizzazione "segue", ma cosa succede se ho bisogno di interrompere l'azione "segue" a determinate condizioni? Apparentemente non puoi, dal momento che prepareForSegue: sender: metodo non lo consente, e sembra essere l'unico callback che viene chiamato quando una transizione sta per essere eseguita.performSegueWithIdentifier vs instantiateViewControllerWithIdentifier

Quindi ho indovinato che potrei entrare nella tabellaView: didSelectRowAtIndexPath: ed eseguire i passaggi a livello di programmazione. Subottimale, ma comunque ...

Bene, si scopre che ho sbagliato. O almeno, sto facendo qualcosa di sbagliato. Il modo più ovvio per farlo sarebbe

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"TheOtherIdentifier" sender:self]; 
} 

ma l'intera applicazione si blocca con un SIGABRT, che non dà tutte le informazioni utili (e sì, io sono sicuro che è quella linea che rende l'incidente app, ho controllato con il debugger :) Inoltre, il VC sto cercando di caricare ha l'identificatore impostato correttamente, perché il seguente codice

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"TheOtherIdentifier"]; 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

"funziona". Le virgolette indicano che questo non è chiaramente il modo in cui tale transizione dovrebbe essere eseguita.

Ora: idee?

+0

Giusto per essere chiari, hai detto di aver impostato questo identificatore per il controller della vista di destinazione. Ma hai impostato un identificatore per il seguito stesso? Questo è l'identificatore che devi usare nel primo caso. –

+0

Ok, mi mancava quello. Fare riferimento alla risposta di T.J. per ulteriori commenti. – Morpheu5

risposta

8

Prova questa:

  1. utilizzare il primo blocco di codice e non il secondo.
  2. Nel controllo storyboard trascinare dalla cella all'altro controller della vista. Si noti che viene creato un seguito.
  3. Fare clic sul seguito. Utilizzare l'ispettore attributi per fornire il seguito e l'identificatore "theOtherIdentifier" (minuscolo "t" consigliato). Seleziona anche uno stile successivo di "push" presumendo che tu stia utilizzando un controller di navigazione.
  4. Storyboard creerà un'istanza per l'altro controller di visualizzazione. Assicurati di non farlo nel tuo codice.
+0

Grazie, che chiarisce il problema, tranne che se imposto i passaggi tramite IB, viene eseguito indipendentemente da cosa. Dovrei includere una condizione, ad esempio devo controllare l'identità dell'utente in base ai valori immessi in altre celle. – Morpheu5

+0

Ok, scusa, mi mancava la parte di controllo dello storyboard :) EDIT: Woops. Ancora una volta mi dispiace. Ho zumato fuori per creare il seguito da un VC all'altro, ma ho appena realizzato che potevo farlo trascinando la barra di sistema superiore. Nessun problema, comunque: ci sono riuscito :) – Morpheu5

+0

Grande. Sono contento che tutto abbia funzionato. Creare un seguito dalla per selezionare nel controller di visualizzazione nella barra di sistema è una novità per me. Ho usato per creare pulsanti nascosti per i passaggi condizionali. –