0

私は自分のプログラムにキー値のコーディングを実装しているので、あまり快適ではありません。私は、オブジェクトとキーを初期化した開始ドキュメントに解析メソッドが実装されているコントローラークラスを持っています。クラス Universal のすべてのデータ メンバーはタイプ id です。

            univ=[[Universal alloc] init];
            [univ setValue:univ.datamember1 forKey:@"1"];
            [univ setValue:univ.datamember2 forKey:@"2"];
            [univ setValue:univ.datamember3 forKey:@"3"];
            [univ setValue:univ.datamember4 forKey:@"4"];
            [univ setValue:univ.datamember5 forKey:@"5"];

エンドエレメントメソッドのデータメンバーに値を設定しています:

         id temp1=[univ valueForKey:@"1"];
        temp1=strVal;
        [resultArray addObject:univ];

そして、このコードに対して次の例外が発生しています。

'NSUnknownKeyException', reason: '[<Universal 0x6e994d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key 1

これの理由は何ですか。何かが足りないか、すべてが間違っていますか??

4

3 に答える 3

2

ほとんどの場合、Key-Value コーディングを実装する必要はありません。代わりに、さまざまな規則に準拠するクラスを作成すると、Key-Value コーディングが自動的に機能します。

規則は、KVC を介してプロパティにアクセスできるようにするためにメソッドに名前を付ける方法に関するものです。

あなたのコード:

        univ=[[Universal alloc] init];
        [univ setValue:univ.datamember1 forKey:@"1"];
        [univ setValue:univ.datamember2 forKey:@"2"];
        [univ setValue:univ.datamember3 forKey:@"3"];
        [univ setValue:univ.datamember4 forKey:@"4"];
        [univ setValue:univ.datamember5 forKey:@"5"];

は奇妙です。ここで何をしようとしていますか?このコードuniv、オブジェクトの他のプロパティからオブジェクトのプロパティを設定しようとしているようunivです。それは冗長です。

ここでシノニムまたはエイリアスを確立していると思います-キー「1」をプロパティにマップしていると思いますdatamember1。それは正しくありません。-setValue:forKey:メソッドは、プロパティの値を実際に設定するためのものです。これは、setter メソッドを呼び出すのと非常によく似ています。実際、通常は setter メソッドが呼び出されます。

したがって、あなたが書いたものは次のようになります。

        univ=[[Universal alloc] init];
        [univ set1:univ.datamember1];
        [univ set2:univ.datamember2];
        [univ set3:univ.datamember3];
        [univ set4:univ.datamember4];
        [univ set5:univ.datamember5];

私はそれがあなたの意図したものではないかと疑っています。KVC 以外の用語で何をしようとしているのかを説明すると役立つ場合があります。どのプロパティを変更しようとしていますか (変更している場合)? それらにどのような値を割り当てますか? 通常のセッターとゲッターだけを使用して、どのようにそれを行いますか?

後で、このコードを投稿しました:

    id temp1=[univ valueForKey:@"1"];
    temp1=strVal;
    [resultArray addObject:univ];

繰り返しますが、これは奇妙で紛らわしいです。のプロパティ値を変更しようとしていると思われますがuniv、動作させることができたとしても、それはそのコードが達成することではありません。univ最初の行は、プロパティの名前が「1」であるオブジェクトのプロパティの値を取得しようとします。プロパティの有効な名前ではありません。とにかく、取得した値をローカル変数に格納しますtemp1。2 行目は、1 行目の結果を単純に破棄し、別の値をローカルtemp1変数に格納します。temp1変数は、オブジェクトから取得した結果を格納していた直前でも、オブジェクトから独立してunivunivます。変更しても変更temp1できませんuniv(が指すオブジェクトにメッセージを送信しますが)temp1そのオブジェクトを変更する可能性があり、 によって指されている可能性もありますuniv)。

Key-Value Coding を使用する準備がまだできていないようです。基本をよりよく理解する必要があります。また、コンパイル時に既知の静的なキーで Key-Value Coding を使用する必要はほとんどありません。キー値コーディングは、コンパイル時にそのプロパティの名前がわからないが、実行時にデータとして名前を取得できる場合に、オブジェクトのプロパティに動的にアクセスするためのものです。

于 2012-05-23T10:45:40.893 に答える
0

KVC 準拠の確保に関する Apple のドキュメントのセクションをお読みください。

それはこう言います:

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

  • -<key>、-is<Key> という名前のメソッドを実装するか、インスタンス変数 <key> または _<key> を持ちます。
  • プロパティが変更可能な場合は、-set<Key>: も実装する必要があります。

プロパティの合成もメソッドの実装と見なされるため、Universalクラスにはメソッド1(および2その他) と呼ばれるメソッドset1:と、数字で始まるメソッド名を持つことは違法であるため、絶対に存在しない別のメソッドが呼び出される必要があります。

于 2012-05-23T10:28:42.903 に答える
0

アクセスしようとしているキーのセッターとゲッターを実装しておらず、-setValue:forUndefinedKey:.

実行時に、NSObject の実装は-setValue:forKey:「set1:」という名前のメソッドを探し、それが見つからない場合は、「1」という名前の ivar を探します (これは ivar の正式な名前ではありませんが、それでも)、それに失敗すると、-setValue:forUndefinedKey:実装していない送信を試みます。

キーと値のコーディングに関するドキュメントを読み、クラスを KVC に準拠させる方法を見つけてください。

于 2012-05-23T10:30:47.553 に答える