チェックマークの状態をコア データに保存するにはどうすればよいですか?
-
19-09-2019 - |
質問
ユーザーが + ボタンを押し、リストに表示したい項目を入力して保存をクリックするリスト アプリがあります。テーブルはコア データとともに保存されます。唯一の問題は、セルがテープ化されているときにチェックマークを表示したいことです。複数選択を有効にしました
UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
thisCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
thisCell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
ユーザーが終了した後もチェックマークがセルに保持されるようにしたいと考えています。エンティティに「checks」という属性を作成し、それにブール型を指定しましたが、行にヒットするとチェックが表示され永続化されるようにする方法がわかりません。ご協力をいただければ幸いです。ありがとう
解決
これが私のやり方です。注目すべき点が 1 つあります。CoreData はブール値を保存しないため、「ブール」というラベルの付いたプロパティは実際には型です。 NSNumber
. 。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"]
. 。その後、という名前のサブクラス化された管理オブジェクトに切り替えました。 JKItem
, これが、2 番目のメソッドセットが使用できる理由です。 item.isDone
コンパイラ警告は生成されません。