これが私のやり方です。1 つの注目すべき点: CoreData はブール値を格納しないため、「boolean」とラベル付けされたプロパティは実際には typeNSNumber
です。CoreData とブール値を扱うときは、前後に変換することを覚えておく必要があります。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
[selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
} else {
[selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
}
}
UITableViewController
のデリゲートとしてセットを持っているNSFetchedResultsController
ので、クエリ内の管理対象オブジェクトに加えた変更 ^^^ により、次の 2 つのメソッドが実行されます。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *defaultCellIdentifier = @"Item";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
}
NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
cell.textLabel.text = [item valueForKey:@"name"];
if ([[item valueForKey:@"checks"] boolValue]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
これがすべてを結びつける方法です
- ユーザーが行をクリックする
- tableView:didSelectRow... メソッドは、適切な管理対象オブジェクトの「isDone」プロパティを変更します。
- フェッチされた結果コントローラーは、管理対象オブジェクトが変更されたことを認識し、
controllerDidChangeContent
そのデリゲートでメソッドを呼び出します。
- 私の
controllerDidChangeContent
方法は、テーブルビューのすべてのデータをリロードするだけです
- tableView がリロードされると、私の tableView:cellForRow... メソッドは管理項目の「isDone」プロパティをチェックして、セルにチェックマークが必要かどうかを確認します。
混乱しないように、最初はジェネリックを使用してNSMangagedObject
行の状態を格納しました。これが、投稿した最初のメソッドに[selectedObject valueForKey:@"isDone"]
. 後で、サブクラス化された という名前のマネージド オブジェクトに切り替えました。これが、2 番目のメソッド セットがコンパイラの警告を生成せずJKItem
に使用できる理由です。item.isDone