iPhone アプリが NSUnknownKeyException でクラッシュする[重複]
-
09-06-2019 - |
質問
この質問にはすでに答えがあります:
私は初めての iPhone アプリを作成しているので、デバッグの方法についてはあまり理解できていません。基本的に、私のアプリは画像を表示し、タッチすると短いサウンドを再生します。XCode でプロジェクトをコンパイルしてビルドすると、すべてが正常にビルドされますが、アプリを iPhone シミュレーターで実行するとクラッシュします。
次のエラーが表示されます。
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 は私が背景に使用している画像です。
NSUnknownKeyException が何を意味するのか、またはクラスがキーのキー値コーディングに準拠していない理由がわかりません。
解決
(これは実際には iPhone 固有のものではありません。同じことが通常の Cocoa でも起こります)。
NSUnknownKeyException は、使用時の一般的なエラーです。 キーと値のコーディング オブジェクトが持っていないキーにアクセスします。
ほとんどの Cocoa オブジェクトのプロパティには直接アクセスできます。
[@"hello world" length] // Objective-C 1.0
@"hello world".length // Objective-C 2.0
または、Key-Value コーディング経由:
[@"hello world" valueForKey:@"length"]
次の行を使用すると、NSUnknownKeyException が発生します。
[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]
NSString には「purpleMonkeyDishwasher」というプロパティ (キー) がないためです。
コード内の何かが UIView のキー 'kramerImage' の値を設定しようとしていますが、そのキーは (どうやら) サポートされていません。Interface Builder を使用している場合は、ペン先に何か問題がある可能性があります。
「kramerImage」が使用されている場所を見つけて、そこから追跡してみてください。
他のヒント
また、ビューの名前を変更するときは、ファイルの所有者の参照を削除することを忘れないでください。このエラーが発生する場合もあります。
このエラーが発生する場所とその修正方法を次に示します。カスタム TableViewCell を備えたペン先をロードしたときにこの問題が発生しました。IB を使用して、ファイルの所有者、ファーストレスポンダー、および TableViewCell のみを含む xib を構築しました。TableViewCell には、rootCell と呼ばれる 4 つの IBOutlet UILabel を持つクラスに一致する 4 つの UILabel がありました。TableViewCellのクラスをrootCellに変更しました。いくつかの変更を加えるまでは正常に動作していましたが、突然 setValue:forUnknownKey を取得するようになりました。ペン先からクラスをロードした後にクラスをインスタンス化したとき:
NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];
cell = [nib objectAtIndex:0];
ペン先をロードしようとした最初の行で失敗しました。しばらくして、IBOutlet ラベルを rootCell クラスではなくルート コントローラーに照合しようとしていることに気づきました。それが私の情報でした。私の間違いは、ファイルの所有者を誤って rootCell クラスに変更したことです。これを NSObject に戻すと、ロード時にデリゲート (rootController) と一致しようとしませんでした。したがって、上記のことを行う場合は、File's Owner を NSObject にしますが、UITableCell を目的のクラスにします。
この状況が発生しましたが、変数のすべてのインスタンスを見つけて削除した後でも、アプリは依然としてクラッシュしたことがわかりました。ここで何が起こったのか...XIB のテキストフィールドから viewController.h に変数の別のインスタンスを作成しましたが、もう必要ないことに気づき、削除しました。私のプログラムはそれを認識し、プログラム内でそれを使用しようとし続けたことが判明したため、将来的に他の場所でこれが発生した場合は、ボタンやテキストフィールドなどをXIBで右クリックし、余分な未使用の変数を削除してください。
今日も同じ問題がありました。Navigation Controller の View Controller に適切なクラスが指定されていませんでした。これは、Interface Builder でビューに正しいクラスを指定しなかった場合によく発生します。
無効なセレクターの問題も発生します。Interface Builder のクラスと接続を常に確認してください。
これが私が解決した方法です。インターフェイスビルダーでビューコントローラーを右クリックすると、不足しているアウトレットまたはアクションメソッドに感嘆符が表示されるはずです。すべての参照を見つけて削除すると、それが解決しました。
これは、.m ファイル内のアクション メソッドを削除したために発生しました。
やってるみたいだね
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;
次に、そのイメージビューを合成した後、Interface Builder で「MyFirstIphoneAppViewController.xib」を開くと、そのアウトレットを「MyFirstIphoneAppViewController.xib」のファイル所有者から「InitialkramerImage」にリンクするツール(メニュー)/ライブラリからイメージビューを取得します。 。次に、プロジェクトを保存しました。ただし、その後、アウトレット変数の名前「InitialkramerImage」を「kramerImage」に変更する可能性があります。それで、これをやった後、
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;
実行時にプロジェクトを保存すると、「MyFirstIphoneAppViewController.xib」に「InitialkramerImage」のアウトレットが存在しません。したがって、プロジェクトを実行すると、Imageview から 'kramerImage' を参照するアウトレットはなくなります。
「ビューを表示するために、uiviewcontrollerは、存在しない「初期Kramerimage」へのアウトレットを見つけようとします。」
したがって、「NSUnknownKeyException」がスローされます。
ファイルの所有者]を右クリックして、ペン先(.xib)ファイルを開くことで、不足しているアウトレットを確認できます。
このコードを別の場所で実行し、zip/圧縮ファイルがあった場合は、もう一度解凍してみてください。理由はわかりませんが、抽出の問題のような気がします。
または、IBOutlet を kramerImage に変更して、NIB で再度バインドしてみることもできます。