Frage

Ich schreibe meine erste iPhone-App, daher bin ich noch nicht dazu gekommen, viel über das Debuggen herauszufinden.Im Wesentlichen zeigt meine App ein Bild an und gibt bei Berührung einen kurzen Ton ab.Beim Kompilieren und Erstellen des Projekts in XCode wird alles erfolgreich erstellt, aber wenn die App im iPhone-Simulator ausgeführt wird, stürzt sie ab.

Ich erhalte die folgende Fehlermeldung:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage hier ist das Bild, das ich als Hintergrund verwende.

Ich bin mir nicht sicher, was NSUnknownKeyException bedeutet oder warum die Klasse nicht mit der Schlüsselwertcodierung für den Schlüssel kompatibel ist.

War es hilfreich?

Lösung

(Das ist nicht wirklich iPhone-spezifisch – das Gleiche passiert auch bei normalem Cocoa).

NSUnknownKeyException ist ein häufiger Fehler bei der Verwendung Schlüsselwertcodierung um auf einen Schlüssel zuzugreifen, den das Objekt nicht hat.

Auf die Eigenschaften der meisten Cocoa-Objekte kann direkt zugegriffen werden:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

Oder über Schlüsselwertcodierung:

[@"hello world" valueForKey:@"length"]

Ich würde eine NSUnknownKeyException erhalten, wenn ich die folgende Zeile verwenden würde:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

weil NSString keine Eigenschaft (Schlüssel) namens „purpleMonkeyDishwasher“ hat.

Etwas in Ihrem Code versucht, einen Wert für den Schlüssel „kramerImage“ in einer UIView festzulegen, die diesen Schlüssel (anscheinend) nicht unterstützt.Wenn Sie Interface Builder verwenden, liegt möglicherweise etwas in Ihrer Feder.

Finden Sie heraus, wo „kramerImage“ verwendet wird, und versuchen Sie, es von dort aus aufzuspüren.

Andere Tipps

Vergessen Sie auch beim Umbenennen einer Ansicht nicht, den Verweis auf den Besitzer der Datei zu löschen.Es kann auch zu diesem Fehler kommen.

Hier erfahren Sie, wo dieser Fehler auftritt und wie Sie ihn beheben können.Ich habe es bekommen, als ich eine Feder geladen habe, die gerade eine benutzerdefinierte TableViewCell hatte.Ich habe IB verwendet, um eine XIB zu erstellen, die nur den Eigentümer der Datei, den Ersthelfer und die TableViewCell enthielt.Die TableViewCell hatte gerade 4 UILabels, die einer Klasse mit 4 IBOutlet-UILabels namens rootCell entsprachen.Ich habe die Klasse der TableViewCell in rootCell geändert.Es funktionierte gut, bis ich ein paar Änderungen vornahm und ich plötzlich den setValue:forUndefinedKey erhielt:als ich gerade die Klasse instanziierte, nachdem ich sie von einer Feder geladen hatte:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

Es schlug in der ersten Zeile fehl, als die Feder geladen werden wollte.Nach einer Weile bemerkte ich, dass versucht wurde, die IBOutlet-Labels dem Root-Controller zuzuordnen, NICHT der RootCell-Klasse!Das war mein Hinweis.Was ich falsch gemacht habe, war, versehentlich den Eigentümer der Datei in die RootCell-Klasse zu ändern.Als ich es wieder in NSObject geändert habe, wurde beim Laden nicht versucht, mit dem Delegaten (rootController) übereinzustimmen.Wenn Sie also das oben Gesagte tun, machen Sie den Eigentümer der Datei zu einem NSObject, aber machen Sie die UITableCell zur gewünschten Klasse.

Ich hatte diese Situation und es stellte sich heraus, dass meine App auch dann noch abstürzte, nachdem ich alle Instanzen der Variablen gefunden und gelöscht hatte.Hier ist, was passiert ist...Ich habe eine weitere Instanz einer Variablen aus einem Textfeld von meinem XIB in meinem viewController.h erstellt, aber mir wurde klar, dass ich sie nicht mehr brauchte, und ich habe sie gelöscht.Es stellte sich heraus, dass mein Programm das erkannte und weiterhin versuchte, es im Programm zu verwenden. Wenn dies in Zukunft irgendwo anders passiert, gehen Sie einfach in Ihre XIB, klicken Sie mit der rechten Maustaste auf die Schaltfläche oder das Textfeld usw. und löschen Sie alle zusätzlichen nicht verwendeten Variablen.

Ich hatte heute das gleiche Problem.Ich hatte nicht die richtige Klasse für den View Controller in meinem Navigationscontroller angegeben.Dies kommt häufig vor, wenn Sie im Interface Builder nicht die richtige Klasse für Ihre Ansichten angeben.

Es treten auch Probleme mit ungültigen Selektoren auf.Überprüfen Sie immer Ihre Interface Builder-Klassen und -Verbindungen!

So habe ich mein Problem gelöst: Klicken Sie im Interface Builder mit der rechten Maustaste auf den View Controller. Auf dem fehlenden Ausgang oder der fehlenden Aktionsmethode sollte ein Ausrufezeichen angezeigt werden.Suchen und entfernen Sie alle Verweise, und das hat das Problem gelöst.

Dies geschah, weil ich die Aktionsmethode in der .m-Datei gelöscht habe.

Es scheint, dass du es tust

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

Nachdem Sie diese Bildansicht synthetisiert haben, nehmen Sie beim Öffnen von „MyFirstIphoneAppViewController.xib“ im Interface Builder eine Bildansicht aus dem Tool(menü)/der Bibliothek und verknüpfen diesen Ausgang mit dem „InitialkramerImage“ vom Dateieigentümer von „MyFirstIphoneAppViewController.xib“. .Dann haben Sie das Projekt gespeichert.Danach können Sie jedoch den Namen der Outlet-Variablen „InitialkramerImage“ in „kramerImage“ ändern.Also, nachdem ich das getan habe

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

und Speichern des Projekts, wenn Sie es ausführen. Es gibt keinen Ausgang von „InitialkramerImage“ in „MyFirstIphoneAppViewController.xib“.Wenn Sie das Projekt ausführen, gibt es also keine Verweise von Imageview auf „kramerImage“ und

"Zum Anzeigen der Ansicht versucht UiviewController, das Outlet zu" Initialkramerimage "zu finden, das nicht vorhanden ist.

Es wird also die „NSUnknownKeyException“ ausgelöst.

Sie können den fehlenden Auslass überprüfen, indem Sie die NIB (.xib) -Datei öffnen und dann mit der rechten Maustaste auf den "Dateienbesitzer" klicken.

Wenn Sie diesen Code woanders erstellt haben und eine ZIP-/komprimierte Datei hatten, versuchen Sie, sie erneut zu extrahieren.Es könnte funktionieren, ich weiß nicht warum, aber ich habe das Gefühl, dass es sich um ein Extraktionsproblem handelt.

oder Sie können versuchen, das IBOutlet in kramerImage zu ändern und es erneut in NIB zu binden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top