UIViewController wirft eine nicht erkannte Selektorausnahme auf prepareForSegue

7

Ich versuche, die Stanford CS193p iOS Programmiervorlesungen zu verfolgen. Eines der Demo-Programme namens "Happiness" erstellt zwei UIViewControllers, einen "PsychViewController" und einen "HappinessViewController". Es geht vom PsychViewController zum HappinessViewController über eine Zielaktionsmethode.

Der folgende Code verursacht weiterhin diese Ausnahme: "- [UIViewController setHappiness:]: unerkannter Selektor, der an die Instanz"

gesendet wurde

Hier ist der anstößige Code:

%Vor%

Ich habe diese Site und andere Seiten durchsucht, und normalerweise tritt dieser Fehler auf, weil der generische UIViewController nicht korrekt auf das im Programm verwendete View-Controller-Objekt eingestellt wurde, in diesem Fall auf den "HappinessViewController". Aber ich habe den generischen UIViewController mit dem Identity Inspector in IB als HappinessViewController eingestellt, und ich bekomme immer noch die Ausnahme. Ich reiße mir die Haare aus, wenn jemand helfen könnte, wäre es sehr geschätzt.

    
user1790252 01.11.2012, 03:15
quelle

8 Antworten

7

Ich habe das Problem herausgefunden. Obwohl ich korrekt angegeben hatte, dass der relevante UIViewController ein HappinessViewController war, wurde der Linker aus irgendeinem Grund nicht mit den richtigen Dateien verknüpft. Die Lösung bestand darin, auf die .xcodeproj-Datei in Xcode doppelzuklicken, dann zu Build Phases zu gehen und die Dateien manuell unter "Compile Sources" hinzuzufügen.

    
user1790252 01.11.2012, 20:20
quelle
19

Schauen wir uns die Ausnahme an:

%Vor%

Dies sagt Ihnen zwei Dinge über die Nachricht, die nicht erkannt wurde. Es zeigt Ihnen den Selektor setHappiness: . Es teilt Ihnen auch die aktuelle Laufzeitklasse des Empfängers mit, UIViewController .

Natürlich hat UIViewController keine Methode namens setHappiness: . Deshalb hast du die Ausnahme.

Sie haben eine Unterklasse von UIViewController namens HappinessViewController geschrieben, die eine setHappiness: -Methode (oder eine Lese- / Schreibeigenschaft namens happiness , die die Methode generiert) erstellt. Und Sie beabsichtigten, dass der Empfänger (der Zielansichtscontroller) eine Instanz dieser Unterklasse ( HappinessViewController ) ist.

Aber die Ausnahme besagt, dass der Ziel-View-Controller nur ein einfacher UIViewController ist. Auch wenn Sie das vermutlich getan haben, haben Sie wahrscheinlich nicht die benutzerdefinierte Klasse des Ansichtscontrollers im Storyboard festgelegt. Vielleicht haben Sie die benutzerdefinierte Klasse eines anderen View-Controllers festgelegt, aber Sie haben die Klasse für das Ziel dieses Segments nicht festgelegt.

Sie müssen die benutzerdefinierte Klasse des Zielansicht-Controllers im Identity Inspector wie folgt einstellen:

    
rob mayoff 01.11.2012 03:32
quelle
4

Für mich hat das Ändern der Klasse des View-Controllers im Storyboard funktioniert.

    
Michal Shatz 16.07.2014 08:06
quelle
1

Versuchen Sie es so:

%Vor%     
user427969 01.11.2012 03:19
quelle
0

Ich hatte heute das gleiche Problem und es war, weil meine benutzerdefinierte Klasse in einer Bibliothek war. Die Bibliothek selbst wurde in Build-Phasen verlinkt, aber das allein reichte nicht aus, um die Klasse zu erfassen. So habe ich es schließlich gelöst, indem ich die folgende Zeile zu meinem AppDelegate hinzufüge.

%Vor%

Dies zwingt den Linker, die Klasse einzubinden. Andernfalls reicht ein einfaches Verknüpfen in der Bibliothek möglicherweise nicht aus, um die Klasse einzubinden, es sei denn, es wird irgendwo in der Anwendung darauf verwiesen.

    
nishant 09.12.2014 06:23
quelle
0

Ich habe versucht, einen Cast hinzuzufügen und es hat für mich funktioniert, ich hatte das gleiche Problem:

%Vor%     
ssdeg7 12.04.2015 19:00
quelle
0

Überprüfen Sie, welche prepareForSegue ausgelöst wird. Mein Problem war, dass 2 Segmente im aktuellen viewController und im eingehenden viewController ausgelöst wurden. Die Lösung und immer eine gute Übung ist es, Segueidentifikatoren zu überprüfen.

%Vor%     
Iris Veriris 21.09.2017 00:57
quelle
-1

Cast vor dem Zuweisen

%Vor%

Stellen Sie sicher, dass in Ihrem Storyboard HappinessViewController als VC-Klasse festgelegt ist.

    
exeapps 13.05.2013 19:36
quelle