UI表视图单元格检查标记重复swift

时间:2015-05-27 19:56:49

标签: uitableview swift

我检查表格单元格时,向下滚动复选标记。 我知道这是由于细胞重用,但不知道如何解决它。

填充表格的功能

override func tableView(tableView: UITableView, cellForRowAtIndexPath      indexPath: NSIndexPath) -> UITableViewCell {

    let item = self.myEvents[indexPath.row]

    let cell = tableView.dequeueReusableCellWithIdentifier("row", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel!.text = self.myEvents[indexPath.row]
    return cell
    }

//使表格可检查的功能

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    println("indexpath: \(indexPath)")
    let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
    let text = cell.textLabel!.text
    if cell.accessoryType == UITableViewCellAccessoryType.None {
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        //let text = cell.textLabel!.text
        if(checkedEvents[0] == ""){
            checkedEvents[0] = text!
        }else{
            checkedEvents.append(text!)
        }
    } else {
        cell.accessoryType = UITableViewCellAccessoryType.None
        var index = 0
        for event in checkedEvents{
            if event == text{
                self.checkedEvents.removeAtIndex(index)
                index++
            }
        }
    }
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

}

2 个答案:

答案 0 :(得分:1)

首先,您需要将所选行的编号存储在某处。 self.selectedRowNumber怎么样?

var selectedRowNumber: Int? = nil

当用户选择一行(短版)时设置:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
    cell.accessoryType = .Checkmark
    self.selectedRowNumber = indexPath.row

    // You'll also need some code here to loop through all the other visible cells and remove the checkmark from any cells that aren't this one.
}

现在修改您的-tableView:cellForRowAtIndexPath:方法以清除附件(如果它不是所选行),或者添加它(如果它是:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("row", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel!.text = self.myEvents[indexPath.row]

    cell.accessoryType = .None
    if let selectedRowNumber = self.selectedRowNumber {
        if indexPath.row == selectedRowNumber {
            cell.accessoryType = .Checkmark
        }
    }
    return cell
}

此代码在浏览器中编写,可能需要一些修复才能编译。

答案 1 :(得分:0)

如果只想进行一次选择,请将tableView.reloadData()放入didSelectRowAtIndexPath函数中