0

この質問の手順に従っています: UITableViewCellキャッシングを使用しているときに、左側のUITableViewにチェックボックスを追加する方法は?

行がタップされた場合にチェックされる単純なチェック ボックスは必要ありません。セル自体が選択した項目の詳細ビューを既に読み込んでいるため、チェックボックスがタップされたときにのみ変化するチェック ボックスが必要です。

  • チェックされたボタンを正しく表示できるようにするには、セルを右に「移動」するにはどうすればよいですか? (これを解決しました:ストーリーボードでセルを選択し、属性インスペクターに移動して、識別の幅を変更します)

  • indexPath.rowが機能しないため、タグには何を使用すればよいですか? 最初の項目を選択すると、8番目がチェックされます(選択した回答でこれを解決しました)

更新:回答を正しいものとして選択しましたが、問題は部分的にしか解決しませんでした。チェックされたアイテムは、以前と同じ順序を維持するのではなく、ビューがリロードされるとセクションの最後に移動されます。誰でも理由を知っていますか?

この状況の画面

cellForRowAtIndexPath の更新されたコードは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView2 dequeueReusableCellWithIdentifier:@"Cell2"];
UIButton *checkBox;
if (cell.tag == 0) {
    checkBox = [[UIButton alloc]initWithFrame:CGRectMake(5, 10, 20, 20)];
    UIImage *normalImage = [UIImage imageNamed: @"unchecked.png"];
    UIImage *selectedImage = [UIImage imageNamed: @"checked.png"];
    [checkBox setImage:normalImage forState:UIControlStateNormal];
    [checkBox setImage:selectedImage forState:UIControlStateSelected];
    [checkBox addTarget:self action:@selector(makeWatched:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:checkBox];
    cell.tag = 1;
}

for (id obj in cell.contentView.subviews) {
    if ([obj isKindOfClass:[UIButton class]]) {
        checkBox = obj;
        checkBox.tag = indexPath.row;
        break;
    }
}


Episodi *epi = [self.fetchedResultsController objectAtIndexPath:indexPath];


 checkBox.selected = ([self.selectedChecks containsObject:[NSNumber numberWithInt:  (indexPath.row)]])? YES : NO;

if ([epi.watched isEqualToString:@"1"]) {

    NSLog(@"Entra");
    checkBox.selected = YES;

}

cell.textLabel.text = epi.episodeTitle;
return cell;

}

チェックボックス アクションの更新されたコード:

-(void)makeWatched:(UIButton *) checkButton {
    if (checkButton.selected == NO) {

       Episodi *epi = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:checkButton.tag inSection:sectionNumber]];
       [epi setWatched:@"1"];
       checkButton.selected=YES;
       NSError *error = nil;
       if (![managedObjectContext save:&error]) {
           NSLog(@"Saving changes failed: %@", error);
       } else {
        // The changes have been persisted.
    }

    [self.selectedChecks addObject:[NSNumber numberWithInt:(checkButton.tag)]];


    [self.tableView2 reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:checkButton.tag inSection:sectionNumber]] withRowAnimation:UITableViewRowAnimationNone];



}else{

    Episodi *epi = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:checkButton.tag inSection:sectionNumber]];
    [epi setWatched:@"0"];
    if ([epi.watched isEqualToString:@"0"]){
       NSLog(@"Not Watched anymore");
    }
    checkButton.selected=NO;
    NSError *error = nil;
    if (![managedObjectContext save:&error]) {
        NSLog(@"Saving changes failed: %@", error);
    } else {
        // The changes have been persisted.
    }


    [self.selectedChecks removeObjectIdenticalTo:[NSNumber numberWithInt:(checkButton.tag)]];
    [self.tableView2 reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:checkButton.tag inSection:sectionNumber]] withRowAnimation:UITableViewRowAnimationNone];
  }
 }
4

2 に答える 2

2

UITableViewCell のサブクラスを作成し、xib を使用してカスタム セルのチェックボックスとラベルをレイアウトする必要があります。でカスタム UITableViewCell を使用しますtableView:cellForRowAtIndexPath:。そうすれば、毎回再作成される代わりに、カスタム チェックボックスがキャッシュされます。チェックボックスの値 (選択されているかどうか) を設定する必要があります。tableView:cellForRowAtIndexPath:

このチュートリアルをチェックアウトして、xib を使用してカスタム UITableViewCell を作成する方法を確認してください

于 2013-05-17T14:44:12.213 に答える