选择UITableViewCell选中标记更改

Jon*_*an. 47 iphone objective-c tablecell checkmark

我是否正确地认为要将"on"的复选标记更改为"off",我必须更改CellAccessoryType之间none和之间checkmarkdidSelectRowAtIndexPath

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

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

Ale*_*lds 76

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

  2. 在视图控制器的-tableView:cellForRowAtIndexPath:委托方法中,如果单元格等于该值,则设置accessoryTypecellto .否则,将其设置为.UITableViewCellAccessoryCheckmarkindexPath.rowselectedRowUITableViewCellAccessoryNone

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

  • 要添加到Alex的解决方案 - 要在点击单元格时显示复选标记,您还必须在设置所选单元格后输入[tableview reloadData]. (8认同)
  • 这很简单,但是将数据重新加载到整个表格中可能会受到影响.因为你知道你需要更新什么`indexPath.row`,你只需要更新那行,这可以通过表视图方法`-reloadRowsAtIndexPaths:withRowAnimation来完成:`更多细节:http://developer.apple. COM /库/ IOS /文档/ UIKit的/参考/ UITableView_Class /参考/#的reference.html // apple_ref/DOC/UID/TP40006943-CH3-SW40 (6认同)

Zyp*_*rax 59

另一种方案:

-(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;
}
Run Code Online (Sandbox Code Playgroud)

和是:你没有检查是否oldIndexnil:)


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
}
Run Code Online (Sandbox Code Playgroud)

  • 这真是一段很棒的代码。我添加了 Swift 版本。 (2认同)

Ben*_*Ben 5

迅速:

var selectedCell:UITableViewCell?{
    willSet{
        selectedCell?.accessoryType = .None
        newValue?.accessoryType = .Checkmark
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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


Bat*_*Can 5

为了迅速

  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
  }
Run Code Online (Sandbox Code Playgroud)