1

ここで何かが欠けています。それほど難しいことではないことはわかっていますが、理解できません。私は辞書のリストを持っています。それは可変配列にロードされ、それが私のtableViewに入力されます。

plist サンプル:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>title</key>
        <string>entry1</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>
    <dict>
        <key>title</key>
        <string>accessoriesImage</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>
    <dict>
        <key>title</key>
        <string>activationCharge</string>
        <key>checkedState</key>
        <string>NO</string>
    </dict>

そして、それらの辞書の値にアクセスしようとしていますが、混乱しています。

これが私の初期化です:

static NSString *kTitleKey = @"title";
static NSString *kCheckedState = @"checkState";

@interface ViewController ()

@end

@implementation ViewController

@synthesize attributesTableView, attributesArray;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        NSString *attributesFile = [[NSBundle mainBundle] pathForResource:@"attributesPlist"ofType:@"plist"];

        attributesArray = [[NSMutableArray alloc] initWithContentsOfFile:attributesFile];

    }
    return self;
}

関連するビットにスキップして、tableView セルに次のものを入力します。

cell.textLabel.text = [[attributesArray objectAtIndex:[indexPath row]] valueForKey:kTitleKey];

didSelectRowAtIndexPath の後半で、これらの辞書の値をチェックしようとしていますが、そこで失敗しています。

例:

if ([[attributesArray valueForKey:kTitleKey = @"All"] valueForKey:kCheckedState = @"YES"]) {
                        [attributesArray setValue:kCheckedState = @"NO" forKey:@"All"];

[attributesArray setValue:kCheckedState = @"YES" forKey:[[attributesArray objectAtIndex:[indexPath row]] valueForKey:kTitleKey]];

次のエラーが表示されます: valueForUndefinedKey:]: このクラスはキー YES のキー値コーディングに準拠していません。

間違ってアクセスしていることはわかっていますが、変更可能な辞書で満たされた変更可能な配列を使用しているときにそれを行う方法がわかりません。

4

1 に答える 1

2

値を設定するための構文がオフになっていると思います。投稿した最後のコードスニペットには、次のものがあります。

[attributesArray valueForKey:kTitleKey = @"All"]

あなたが思うかもしれないことに反して、これはタイトルを「すべて」に設定しません。代わりに、の値をkTitleKey文字列「All」に置き換えてから、属性配列から「All」の値をフェッチします。代わりに、次のようなものが必要だと思います。

[attributesArray setValue:@"All" forKey:kTitleKey]

その最後の例を通して、同様の更新を行う必要があります。ここで重要な違いを覚えておいてください。

  • valueForKey: 値を取得します。valueForKey:等号を入れても、を使用して何かを設定することはできません。
  • setValue:forKey: 値を設定します。を変更する必要があるときはいつでもこれを使用することをお勧めしますattributesArray

詳細については、 Key-Valueコーディングを確認することをお勧めします。

于 2012-11-19T20:13:09.337 に答える