选择UITableViewCell选中标记更改

时间:2010-05-09 09:19:15

标签: objective-c iphone tablecell checkmark

我认为将“on”的复选标记更改为“off”是正确的,我必须更改CellAccessoryTypenonecheckmark之间的didSelectRowAtIndexPath

因为我已经这样做但是我注意到行为与iphone上的自动锁定设置上的复选标记单元格完全相同。

或者还有其他一些方法可以处理检查标记吗?

8 个答案:

答案 0 :(得分:75)

  1. 在视图控制器中保留一个名为selectedRow的属性,该属性表示代表表格部分中已检查项目的行的索引。

  2. 如果单元格的-tableView:cellForRowAtIndexPath:等于{{{ 1}}价值。否则,请将其设置为accessoryType

  3. 在视图控制器的cell委托方法中,将UITableViewCellAccessoryCheckmark值设置为所选的indexPath.row,例如:selectedRow

答案 1 :(得分:57)

另一种解决方案:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *oldIndex = [self.tableView indexPathForSelectedRow];
    [self.tableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    return indexPath;
}

是的:你不必检查oldIndex是否nil:)


Swift 3及更高版本:

override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if let oldIndex = tableView.indexPathForSelectedRow {
        tableView.cellForRow(at: oldIndex)?.accessoryType = .none
    }
    tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark

    return indexPath
}

答案 2 :(得分:4)

Zyphrax提出了一个对我有用的伟大解决方案!如果您需要清除之前选择的行,只需使用:

[self.tableView reloadData]; 

in

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

答案 3 :(得分:3)

应该是

  

didHighlightRowAtIndexPath

而不是

  

的tableView:didSelectRowAtIndexPath方法

答案 4 :(得分:3)

只有在添加重装表后,Alex的回答才对我有用, in .h

{
  int selectedCell;
}
@property(nonatomic,readwrite)int selectedCell;
.m 中的

* cellForRowAtIndexPath *

if(indexPath.row == selectedCell)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.selected = YES;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selected = NO;
    }

并且在任何地方执行了HighlightRowAtIndexPath或didSelectRowAtIndexPath

 self.selectedCell = indexPath.row;
    [self.tableView reloadData]; 

答案 5 :(得分:3)

迅速:

var selectedCell:UITableViewCell?{
    willSet{
        selectedCell?.accessoryType = .None
        newValue?.accessoryType = .Checkmark
    }
}

然后:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedCell = self.tableView.cellForRowAtIndexPath(indexPath)
    self.mapView.selectAnnotation(self.mapView.annotations[indexPath.row], animated: true)
}

答案 6 :(得分:0)

如果您想将自定义图片用作附件类型,请使用以下代码

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImageView *imgCheckMark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"select_icon.png"]];
    [imgCheckMark setFrame:CGRectMake(self.view.frame.size.width - 30, 25, 14, 18)];
    imgCheckMark.tag = 1000+indexPath.row;

    NSIndexPath *oldIndex = [self.tblSelectService indexPathForSelectedRow];
    [self.tblSelectService cellForRowAtIndexPath:oldIndex].accessoryView = UITableViewCellAccessoryNone;
    [self.tblSelectService cellForRowAtIndexPath:indexPath].accessoryView = imgCheckMark;
    return indexPath;
}

答案 7 :(得分:0)

快速

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
  }

  func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
  }