19

私は初めての 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 が何を意味するのか、またはクラスがキーのキー値コーディングに準拠していない理由がわかりません。

4

8 に答える 8

22

(これは実際にはiPhone固有ではありません。通常のCocoaでも同じことが起こります)。

NSUnknownKeyExceptionは、Key-Valueコーディングを使用してオブジェクトにないキーにアクセスする場合の一般的なエラーです。

ほとんどの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'が使用されている場所を見つけて、そこから追跡してみてください。

于 2008-09-05T17:28:35.070 に答える
10

また、ビューの名前を変更するときは、ファイルの所有者の参照を削除することを忘れないでください。このエラーが発生することもあります。

于 2010-03-29T13:34:10.810 に答える
8

このエラーが発生する場所とその修正方法を次に示します。カスタムTableViewCellを持つペン先をロードするときにそれを取得していました。IB を使用して、File's Owner、First Responder、および TableViewCell だけを持つ xib を作成しました。TableViewCell には、rootCell と呼ばれる 4 つの IBOutlet UILabels を持つクラスに一致する 4 つの UILabels がありました。TableViewCell のクラスを rootCell に変更しました。いくつかの変更を加えるまでは問題なく動作し、ペン先からクラスをロードした後にクラスをインスタンス化していたときに、突然 setValue:forUndefinedKey: を取得していました。

    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 を目的のクラスにします。

于 2010-10-10T06:06:33.027 に答える
2

今日も同じ問題がありました。Navigation Controller の View Controller に適切なクラスが指定されていませんでした。これは、Interface Builder でビューに正しいクラスを指定できなかった場合によく発生します。

また、無効なセレクターの問題も発生します。Interface Builder のクラスと接続を常に確認してください。

于 2011-07-06T17:04:58.883 に答える
2

私はこのような状況にあり、変数のすべてのインスタンスを見つけてそれらを削除した後でも、アプリがクラッシュしたことが判明しました。何が起こったのか... XIB のテキストフィールドから viewController.h に変数の別のインスタンスを作成しましたが、もう必要ないことに気づき、削除しました。私のプログラムはそれを見て、プログラムでそれを使用しようとし続けたので、将来、これが他の場所で発生した場合は、ボタンまたはテキストフィールドなどを XIB で右クリックし、余分な未使用の変数を削除します。

于 2012-07-08T01:58:33.210 に答える
2

これが私の解決方法です。Interface builderでView Controllerを右クリックすると、不足しているアウトレットまたはアクションメソッドに感嘆符が表示されるはずです。すべての参照を見つけて削除し、それで解決しました。

これは、.m ファイルのアクション メソッドを削除したために発生しました。

于 2012-07-18T14:30:33.353 に答える
0

やってるらしい

@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 は、存在しない「InitialkramerImage」へのアウトレットを見つけようとします。」

そのため、「NSUnknownKeyException」がスローされます。

nib(.xib) ファイルを開き、その「ファイル所有者」を右クリックして、欠落しているアウトレットを確認できます。

于 2010-11-10T11:26:06.660 に答える
0

このコードを別の場所で実行し、zip/圧縮ファイルを持っている場合は、もう一度解凍してみてください。うまくいくかもしれませんが、理由はわかりませんが、抽出の問題だと思います。

または、IBOutlet を kramerImage に変更して、NIB で再度バインドすることもできます。

于 2012-05-09T04:23:12.710 に答える