1

ユーザーが + ボタンを押してリストに表示したい項目を入力し、保存を押すリスト アプリがあります。テーブルはコア データとともに保存されます。唯一の問題は、セルがテープで留められているときにチェックマークを表示したいことです。で複数選択を有効にしました

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

ユーザーが終了した後、チェックマークをセルに保持したいと思います。エンティティに「チェック」という属性を作成し、ブール型にしましたが、行にヒットするとチェックが表示されて永続化されるようにする方法がわかりません。どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

7

これが私のやり方です。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;
}

これがすべてを結びつける方法です

  1. ユーザーが行をクリックする
  2. tableView:didSelectRow... メソッドは、適切な管理対象オブジェクトの「isDone」プロパティを変更します。
  3. フェッチされた結果コントローラーは、管理対象オブジェクトが変更されたことを認識し、controllerDidChangeContentそのデリゲートでメソッドを呼び出します。
  4. 私のcontrollerDidChangeContent方法は、テーブルビューのすべてのデータをリロードするだけです
  5. tableView がリロードされると、私の tableView:cellForRow... メソッドは管理項目の「isDone」プロパティをチェックして、セルにチェックマークが必要かどうかを確認します。

混乱しないように、最初はジェネリックを使用してNSMangagedObject行の状態を格納しました。これが、投稿した最初のメソッドに[selectedObject valueForKey:@"isDone"]. 後で、サブクラス化された という名前のマネージド オブジェクトに切り替えました。これが、2 番目のメソッド セットがコンパイラの警告を生成せずJKItemに使用できる理由です。item.isDone

于 2010-02-07T01:10:52.407 に答える