0

ここで問題が発生しました...

私の BOOL が編集され、最後の NSLog で成功しましたが、ViewController を閉じてから再び入る (テーブルを更新する) と、BOOL は最初の値に戻ります。つまり、[context save:&error] に何か問題があります。関数。何か案は?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

for (int i=0; i<[self tableView:tableView numberOfRowsInSection:0]; i++) {

    AccountCell *cell = (AccountCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
    [cell setSelected:(i==indexPath.row) animated:NO];
    NSManagedObject *user = [arr objectAtIndex:indexPath.row];
    [user setValue:[NSNumber numberWithBool:(i==indexPath.row)] forKey:@"active"];
    NSLog(@"Index: %i, Active State: %@", i,[user valueForKey:@"active"]);
    NSError *error;

    if (![context save:&error]) {
        NSLog(@"Saving changes to context failed: %@", error);
    } else {
        // The changes have been persisted.
        NSLog(@"Saved data success");
    }
}
}
4

1 に答える 1

0

いくつかの提案:

save ステートメントを for ループの外に置く方がはるかに理にかなっています。

かどうかを確認する必要があります

  • 管理対象オブジェクトのコンテキストが有効です (non-nil)
  • 神秘的な配列のオブジェクトのコンテキストは、arr保存しているコンテキストと同じです
  • 「アクティブ」プロパティ (スペルを含む) がモデルと管理対象オブジェクトで正しく構成されている (KVC に依存するのではなく、より明確にするためにサブクラス化する必要がある場合があります)。
  • エラー変数に何かがあります

他にもいくつかの設計上の欠陥があると思います。たとえば、セルが表示されていない場合でも、セルを取得して選択状態を設定しています。IMO、基になる管理対象オブジェクトの状態に基づいて、cellForRowAtIndexPath でこれを行う必要があります。

同じセクション内の他のすべてのユーザーの選択を解除することについては、ループがおそらく避けられないということは正しいです。しかし、セクション内のすべてのユーザーを一度に取得してから、それらをループして、必要に応じて「アクティブ」プロパティを設定する方が効率的だと思います。

于 2013-10-30T09:44:33.710 に答える