继承我didSelectRowAtIndexPath
中的代码。关于如何解决这个问题的任何建议或帮助..问题是,当我点击单元格时,许多单元格将具有复选标记....我的计划是当我单击一个单元格时,该单元格将具有Checkmark
- (void)tableView:(UITableView *)thetableView
didSelectRowAtIndexPath:(NSIndexPath *)newindexPath {
[thetableView deselectRowAtIndexPath:[thetableView indexPathForSelectedRow]
animated:true];
UITableViewCell *cell = [thetableView cellForRowAtIndexPath:newindexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
并继承cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
object:(nullable PFObject *)object {
static NSString *cellIdentifier = @"attendance";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
UILabel *student_lastname = (UILabel *)[cell viewWithTag:1];
UILabel *student_firstname = (UILabel *)[cell viewWithTag:2];
UILabel *student_midname = (UILabel *)[cell viewWithTag:3];
student_lastname.text = object[@"Last_Name"];
student_firstname.text = object[@"First_Name"];
student_midname.text = object[@"Middle_Name"];
UILabel *studentNum = (UILabel *)[cell viewWithTag:5];
studentNum.text = [NSString stringWithFormat:@"%d", indexPath.row];
return cell;
}
答案 0 :(得分:1)
所以,我假设您只想在选中单元格时显示复选标记。建议您更新您的问题。
问题出现是因为滚动时正在重复使用您的单元格,您需要先在cellForRowAtIndexPath
方法中相应地设置附件类型,如下所示:
if ([cell isSelected])
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
这是为了确保每当重复使用一个单元格时,如果未选中单元格,则确保它没有任何复选标记,并在选中时显示复选标记。
接下来使用以下两种方法来设置复选标记,并在取消选择/选择单元格时将其删除:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone;
}
此外,您不应该致电[thetableView deselectRowAtIndexPath:[thetableView indexPathForSelectedRow] animated:true];
此方法会自动调用。
希望这能解决你的问题。
答案 1 :(得分:0)
不是任何一个答案的粉丝。 Apple的UITableView实现强制进入MVC(模型 - 视图 - 控制器)。单元格视图,因为它们可以被重用,它们永远不应该存储状态,这就是你依赖于cell.selected所做的事情。如果屏幕上有更多的单元格,那么上面的所有答案都将失败,因为它们将被重复使用。
鉴于您已经有一个对象来存储" Last_Name"等数据,您还应该存储@"已选择"同样。
这是您的代码应该是什么样子:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
object:(nullable PFObject *)object {
static NSString *cellIdentifier = @"attendance";
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
UILabel *student_lastname = (UILabel *)[cell viewWithTag:1];
UILabel *student_firstname = (UILabel *)[cell viewWithTag:2];
UILabel *student_midname = (UILabel *)[cell viewWithTag:3];
student_lastname.text = object[@"Last_Name"];
student_firstname.text = object[@"First_Name"];
student_midname.text = object[@"Middle_Name"];
NSNumber *selectedVal = object[@"Selected"];
if (selectedVal && [selectedVal boolValue]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
UILabel *studentNum = (UILabel *)[cell viewWithTag:5];
studentNum.text = [NSString stringWithFormat:@"%d", indexPath.row];
return cell;
}
然后,在didSelect中,您更改单元格的状态并强制重新加载(仅适用于该单元格)。
- (void)tableView:(UITableView *)thetableView
didSelectRowAtIndexPath:(NSIndexPath *)newindexPath {
NSNumber *selectedVal = object[@"Selected"];
BOOL selected = selectedVal ? ![selectedVal boolValue] : YES;
object[@"Selected"] = @(selected);
[thetableView reloadRowsAtIndexPaths:@[newindexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
}