この質問の手順に従っています: 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];
}
}