Ich liebe es, das iPhone SDK zu kodieren. Es ist die freudigste Codierung, die ich im Vierteljahrhundert gemacht habe (Keuchen!), Die ich für die Codierung verschiedener Computersysteme ausgegeben habe. Es ist eine Kombination aus Objective-C (elegant) und Kakao (schön). Es gibt eine Ausnahme, die ich ständig bekomme, und vergesse nur selten, warum ich es bekomme. Ich dachte, jemand könnte davon profitieren, weil es eine einfache Falle ist.
Die fragliche Ausnahme:
*** Beenden der App wegen nicht abgerufener Ausnahme 'NSInvalidArgumentException', Grund: '*** - [UINavigationController pushViewController:]: nicht erkannter Selektor an Instanz 0x5255c0 gesendet'
Wenn Sie beim Erstellen eines neuen Projekts die Vorlage für navigationsbasierte Anwendungen verwenden, erhalten Sie eine Reihe von Projektdateien, die Ihnen den Weg in Richtung einer funktionalen Anwendung erleichtern. Tatsächlich können Sie auf Build and Go klicken und die App wird eine hübsche Tabellenansicht erstellen, ausführen und anzeigen. Sie werden dann wahrscheinlich Code hinzufügen, um die Tabellensicht in den Zellen anzuzeigen und auf dem Weg zu testen, und es funktioniert. An einem bestimmten Punkt möchten Sie vielleicht berühren, um die Zellen eine neue Ansicht zu öffnen. Die Vorlage stellt eine Beispielmethode "didSelectRowAtIndexPath" zur Verfügung, die hier gezeigt wird:
- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// Die Navigationslogik kann hier gehen. Erstellen Sie einen anderen View-Controller und drücken Sie ihn.
// AnotherViewController * anotherViewController = [[AnotherViewController-Zuordnung] initWithNibName: @ "AnotherView" -Bündel: nil];
// [self.navigationController pushViewController: anotherViewController];
// [anotherViewController-Version];
}
Die Methode selbst ist nicht auskommentiert, sondern alle Anweisungen darin. Diese kommentierten Zeilen geben einen Hinweis darauf, was passieren soll. Die Linie
[self.navigationController pushViewController: anotherViewController];
ist der Schlüssel sowohl für den Betrieb dieser Methode als auch für die Fehlerursache. Es schiebt einen neuen View-Controller auf den Navigations-Stack und zeigt ihn genau so an, wie Sie es möchten. Wenn Sie jedoch diese Zeile auskommentieren und für die Verwendung des neu erstellten View-Controllers anpassen, wird beim Erstellen eine Warnung angezeigt: "warning: 'UINavigationController' reagiert möglicherweise nicht auf -pushViewController: '" Dies ist eine Warnung, kein Fehler. Pah. Wenn Sie es ausführen, wird der oben gezeigte Fehler angezeigt, und der nicht erkannte Selektor wird an eine Instanz gesendet.
Wenn das, was Sie bisher gelesen haben, Ihnen bekannt vorkommt, ist die wahrscheinliche Lösung einfach. Die Zeile oberhalb der von Apple bereitgestellten Vorlage ist falsch. Es gibt eigentlich keine Nachrichtensignatur für UINaigationController namens -pushViewController: aber es gibt eine namens -pushViewController: animated: - Oops! Entschuldigung Apple! Wir lieben dich immer noch. Sehr einfach zu beheben, aber wenn dies nach einem langen Codierungstag geschieht, kann dies zu übermäßiger Frustration führen. Die korrigierte Zeile sollte ungefähr so aussehen:
[self.navigationController pushViewController: anotherViewController animiert: YES];
Wiederaufbau und dieser Fehler wird behoben! Wenn das dein Problem war. Wenn nicht, dann verzweifle nicht. Das Entschlüsseln von Ausnahmemeldungen ist Teil des Spaßes des Codelebens. Ein "nicht erkannter Selektor" bezieht sich immer noch auf die Nachricht, die Sie "an die Instanz" senden, auf ein Objekt, das Sie erstellt haben. Die Ausnahme sagt uns sogar, welche Klasse des Objekts die seltsame Nachricht empfängt (in diesem Fall UINavigationController) und welche Nachricht gesendet wurde (PushViewController :). In diesem Fall wusste der Compiler, dass die gesendete Nachricht etwas unklar war. Dies kann jedoch nicht immer der Fall sein, sodass Sie sich nicht darauf verlassen können. Sie sollten jedoch in der Lage sein, Ihren Code nach der in der Ausnahme gemeldeten Nachricht aus dem Konsolenprotokoll zu durchsuchen. Stellen Sie sicher, dass in dieser Zeile alles in Ordnung ist, und überprüfen Sie in der Dokumentation die genaue Art des Anrufs.