iPhone SDK Risolvi [UINavigationController pushViewController] Selettore non riconosciuto inviato all'istanza

Adoro la codifica per l'SDK di iPhone. È la codifica più gioiosa che ho fatto nel quarto di secolo (sussulto!) Ho passato a codificare vari sistemi di computer. È una combinazione di Objective-C (elegante) e Cocoa (bello). C'è un'eccezione che continuo a ricevere e abbastanza raramente che dimentico il motivo per cui ho capito. Pensavo che qualcuno potesse trarne beneficio perché è una trappola facile da cadere.

L'eccezione in questione:

*** Termina l'applicazione a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '*** - [UINavigationController pushViewController:]: selettore non riconosciuto inviato all'istanza 0x5255c0'

Se si utilizza il modello di applicazione basato su navigazione quando si crea un nuovo progetto, si otterrà un set di file di progetto che consente di ottenere un'applicazione funzionale. In effetti, puoi premere build e go e l'app si compilerà, eseguirà e mostrerà una bella vista tabella. Probabilmente poi aggiungerai del codice per far sì che la tabella visualizzi materiale nelle celle, testando lungo il percorso e funzionerà. Ad un certo punto, potresti voler fare dei tocchi sulle celle per aprire una nuova vista. Il modello fornisce un metodo di esempio "didSelectRowAtIndexPath" mostrato qui:

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// La logica di navigazione potrebbe andare qui. Crea e spinge un altro controller di visualizzazione.
// AnotherViewController * anotherViewController = [[OtherViewController alloc] initWithNibName: @ "AnotherView" bundle: nil];
// [self.navigationController pushViewController: anotherViewController];
// [anotherViewController release];
}

Il metodo stesso non è commentato, ma tutte le istruzioni al suo interno sono. Queste linee commentate forniscono un indizio su cosa dovrebbe accadere. La linea

[self.navigationController pushViewController: anotherViewController];

è la chiave sia per il funzionamento di questo metodo sia per la causa dell'errore. Spinge un nuovo controller di visualizzazione sullo stack di navigazione e lo visualizza, esattamente ciò che si desidera che faccia. Tuttavia, se disattivi questa riga e la aggiusti per utilizzare il nuovo controller di visualizzazione che hai creato, riceverai un avviso quando lo costruisci: "avviso: 'UINavigationController' potrebbe non rispondere a -pushViewController: '" Ma, bene , questo è un avvertimento, non un errore. Pshaw. Eseguilo, tuttavia, e otterrai l'errore mostrato sopra e il selettore non riconosciuto inviato a un'istanza.

Se quello che hai letto fino ad ora sembra familiare, probabilmente la soluzione è semplice. La riga sopra dal modello fornito da Apple è errata. In realtà non esiste una firma del messaggio per UINaigationController chiamata -pushViewController: ma ce n'è una chiamata -pushViewController: animata: - Oops! Mi dispiace Apple! Ti amiamo ancora, comunque. Molto facile da risolvere, ma se succede dopo una lunga giornata di programmazione, può causare eccessiva frustrazione. La linea corretta dovrebbe assomigliare a qualcosa:

[self.navigationController pushViewController: anotherViewController animato: YES];

Ricostruisci e questo errore sarà risolto! Se questo era il tuo problema. Se non lo fosse, allora non disperare. Decifrare messaggi di eccezione fa parte della parte divertente dello stile di vita del coder. Un "selettore non riconosciuto" si riferisce ancora al messaggio che stai inviando "ad esempio", alcuni oggetti che hai creato. L'eccezione ci dice anche quale classe dell'oggetto riceve il messaggio strano (UINavigationController in questo caso) e il messaggio che è stato inviato (pushViewController :). In questo caso, il compilatore sapeva che c'era qualcosa di pessimo sul messaggio che veniva inviato, ma potrebbe non essere sempre in grado di determinarlo, quindi non puoi fare affidamento su di esso. Tuttavia, dovresti essere in grado di cercare nel tuo codice il messaggio segnalato nell'eccezione dal log della console. Assicurati che tutto sia corretto in questa riga, controllando nella documentazione l'esatta natura della chiamata.