TableView选择的单元格 - 当滚动到视线外并且检查新单元格时,复选标记消失

时间:2016-07-08 09:42:40

标签: ios swift uitableview xcode7

我有一个tableViewCell,它使用单元格accessoryType中的复选标记。我有一个函数将单元格的内容放入textField,同样在取消选中文本字段时删除文本。

它似乎工作正常,但如果我检查一个单元格并想要检查一个不可见的单元格(IOW)我需要滚动tableView,检查的单元格(现在不可见)似乎取消选中它自己(仅当我检查一个新的可见细胞时。)

多重选择仅适用于可见细胞。

这是我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) 
    let row = indexPath.row
    cell.textLabel?.text = painArea[row] 
    cell.accessoryType = .None 
    return cell 
    }

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    //selectedRow = indexPath
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    let row = indexPath.row
    let cell = tableView.cellForRowAtIndexPath(indexPath)
        if cell!.accessoryType == .Checkmark {
            cell!.accessoryType = .None
        } else {
            cell!.accessoryType = .Checkmark
        }
    populateDescription()
    print(painArea[row])
}

var painDescription = ["very sore"]

func populateDescription() {
    painDescription.removeAll()
    severityText.text = ""
    for cell in tableView.visibleCells {
        if cell.accessoryType == .Checkmark {
            painDescription.append((cell.textLabel?.text)! + " ")
        }
        var painArea = ""
        var i = 1

        while i <= painDescription.count {
            painArea += painDescription[i-1] + "~"
            i = i + 1
        }
        severityText.text = painArea

    }

我希望我能充分解释自己。我不希望取消选中非可见单元格,从而将其从文本字段中删除,除非我取消选中它。

任何想法都会受到最高的赞赏。

亲切的问候

韦恩

2 个答案:

答案 0 :(得分:1)

由于Cell的可重用性而受到欢迎。而不是在Checkmark中设置didSelect,而是尝试在cellForRowAtIndexPath中设置。您还需要创建这样的model类来解决您的问题

class ModelClass: NSObject {
    var isSelected: Bool = false
    //Declare other property that you are using cellForRowAtIndexPath
}

现在在isSelected中查看此cellForRowAtIndexPath,如下所示。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) 
    let row = indexPath.row 
    let modelClass = painArea[row]
    cell.textLabel?.text = modelClass.name
    if modelClass.isSelected {
        cell.accessoryType = .Checkmark
    }
    else {
        cell.accessoryType = .None
    }
    return cell 
}

现在像这样改变你的didSelect

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var modelClass = painArea[indexPath.row]
    modelClass.isSelected = !modelClass.isSelected
    self.tableView.reloadData()
    populateDescription()
    print(painArea[row])
}

希望这会对你有所帮助。

答案 1 :(得分:0)

这是因为每当你将单元格滚出视图并向后滚动时,它将再次调用cellForRow并将所有内容恢复为默认值,你需要做的就是创建一个正确的dataSource,每当检查了一个单元格,用Bool更新dataSource表示它已被检查,然后在cellForRowcellWillDisplay

中重新设置