3

現在、キー値コーディングに関するすべてのことを学んでいます。

ドキュメントで彼らは言う:

適切なキーのキー値コーディングに準拠していないキー パス シーケンス内のオブジェクトは、valueForUndefinedKey: メッセージを受け取ります。

オブジェクトがキー値コーディングに準拠していない状況を想像してみてください。どうしてそれが起こり得ますか?UIView をサブクラス化すると、明らかに準拠していますよね? しかし、スーパークラスとして NSObject を使用して独自のオブジェクトを作成すると、どうなるでしょうか? そして、スーパークラスのないクラスを作成すると、これは kv に準拠していませんか?

4

2 に答える 2

8

注意深く読むと、「適切なキーに準拠したキー値コーディング」と書かれていることがわかります。これは、基本的に、要求したキーに適切な KVC メソッドがないことを意味します。そのため、NSString はキー「 [[NSString stringWithString:@"foo"] valueForKey:@"dippingSauce"]dippingSauce valueForUndefinedKey:」に対して KVC に準拠していないため、失敗します。dippingSauceインスタンス メソッドやivar がありませんdippingSauce

于 2009-07-22T08:42:43.527 に答える
4

「それは、適切なキーのキー値コーディングに準拠していません」と表示されます。それが意味することは、

@interface MyObject : NSObject {
  NSString *foo;
  NSString *bar;
}

@property (nonatomic, retain) NSString *foo;
@property (nonatomic, retain) NSString *bar;

@end

@interface MyObject

@synthesize foo;
@synthesize bar;

@end

「foo」と「bar」には準拠していますが、「baz」には準拠していません。

それだけの単純なプロパティの場合、デフォルトでは、すべての NSObject サブクラスが基本的な KVC を実装します。コレクションではさらにトリッキーになります。KVC がコレクションに対して正しく機能するようにするには (次のようなことができます:

NSArray *people = ... ;
NSArray *firstNames = [people valueForKey:@"firstName"];

特定の追加メソッドを実装する必要があります。一般に、その機能の最大のユーザーは、CoreData (追加のコレクション メソッドを自動的に生成する) をソースとする Cocoa バインディング (iPhone では使用できません) であるため、通常は基本的に自動的に処理されます。一般に、実際に公開するつもりがない限り、辞書や配列の完全な KVC サポートをオブジェクトに実装しようとはしません。コンプライアンスについては、 KVCガイドを参照してください。

于 2009-07-22T08:44:44.303 に答える