所选UITableViewCell中的选中标记也显示在未选定的单元格上

时间:2015-08-11 13:47:52

标签: ios objective-c uitableview parse-platform

继承我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;
}

2 个答案:

答案 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];
}