2

重複の可能性:
オブジェクトがキー値コーディングに準拠していないのはなぜですか?

私は辞書を持っていて、キー/値をカスタム クラスに追加したいのですが、クラスが KVC に準拠していないというエラーが常に表示されますが、Apple のドキュメントにはそうあるべきであると記載されています。

私のコード:

ContactObject.h:

@interface ContactObject : NSObject
     + (ContactObject *)testAdding;
@end

ContactObject.m:

@implementation ContactObject

- (id)init {
    self = [super init];
    if (self) {
        // customize

    }

    return self;

}

+ (ContactObject *)testAdding
{
    // create object
    ContactObject *theReturnObject = [[ContactObject alloc] init];

    [theReturnObject setValue:@"Berlin" forKey:@"city"];
    [theReturnObject setValue:@"Germany" forKey:@"state"];

    return theReturnObject;

}

@end

私は非常に愚かな何かが欠けていると思います:)

よろしくお願いします...

こんにちは、マティアス

4

4 に答える 4

5

実際に KVC に準拠するには:

プロパティを KVC 準拠にする方法は、そのプロパティが属性、対 1 関係、または対多関係のいずれであるかによって異なります。属性と対 1 の関係の場合、クラスは指定された優先順位で次の少なくとも 1 つを実装する必要があります (キーはプロパティ キーを参照します)。

  1. クラスには、 という名前の宣言されたプロパティがありますkey
  2. key という名前のアクセサ メソッドを実装し、プロパティが変更可能な場合はsetKey:. (プロパティがBoolean属性の場合、getter アクセサー メソッドの形式はisKeyです。)
  3. keyまたはの形式のインスタンス変数を宣言します_key

これら 3 つのいずれも実装されていません。少なくとも KVC を介して設定しようとしているプロパティが必要です。デフォルトの NSObject 実装はプロパティを設定できますsetValue:forKey:が、それらを宣言する必要があります。

于 2013-01-05T21:05:55.883 に答える
2

使用するすべてのプロパティを宣言する必要があります。

@interface ContactObject : NSObject

@property (nonatomic,copy, readwrite) NSString* city;
@property (nonatomic, copy, readwrite) NSString* state;

+ (ContactObject *)testAdding;

@end

または、NSMutableDictionaryオブジェクトを使用します。

例えば:

NSMutableDictionary* dict= [NSMutableDictionary new];
[dict setObject: @"Berlin" forKey: @"city"];
[dict setObject: @"Germany" forKey: @"state"];
于 2013-01-05T21:05:47.767 に答える
1

実際にプロパティを宣言/実装する必要があります。Key-Value コーディングは、すべての NSObject が自動的にキー/値ディクショナリになるという意味ではありません。

この場合、次のように宣言する必要があります。

@property (nonatomic, readwrite, copy) NSString* city;
@property (nonatomic, readwrite, copy) NSString* state;

あなたの@interface宣言で。

于 2013-01-05T21:05:05.753 に答える
1

ObjC はいくつかの点で動的ですが、クラス内のストレージに関しては実際には動的ではありません。特定のキーを KVC に準拠させたい場合はContactObject、それらのキーがクラスに存在する必要があります。KVC ガイドには次のように書かれています。

属性または対 1 の関係であるプロパティの場合、クラスは次のことを行う必要があります。

  • -<key>、 という名前のメソッドを実装する-is<Key>か、インスタンス変数<key>またはを持ちます_<key>。キー名は小文字で始まることがよくありますが、KVC は URL などの大文字で始まるキー名もサポートしています。

  • プロパティが変更可能な場合は、 も実装する必要があります-set<Key>:。メソッドの実装では、-set<Key>:検証を実行しないでください。

これを実現する最も簡単な方法は、必要なキーをプロパティとして宣言することです。

@property (copy, nonatomic) NSString * city;
@property (copy, nonatomic) NSString * state;

ivar を宣言してアクセサーを自分で実装することもできますが、通常、そのようにする正当な理由はありません。宣言されたプロパティが面倒をみてくれます。

于 2013-01-05T21:06:20.810 に答える