滚动时 UITableView 复选标记消失

UITableView Checkmarks disappear when scrolling

我必须在 tableView 上打勾,但如果我滚动时一个勾选标记的单元格不可见,我向后滚动勾选标记消失了。

虽然 运行 此代码

var boolArray = [Bool]()

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)      {




        var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!


        if cell.accessoryType == UITableViewCellAccessoryType.Checkmark {

            cell.accessoryType = UITableViewCellAccessoryType.None

            boolArray[indexPath.row] = false


        }
        else
        {

            cell.accessoryType = UITableViewCellAccessoryType.Checkmark

            boolArray[indexPath.row] = true

        }

    println(boolArray)


}
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->    UITableViewCell
{
    boolArray.append(false)
        var view = UITableViewCell(style: UITableViewCellStyle.Default,    reuseIdentifier: "CellTable")


        return view

}

稍微滚动和勾选后,打印的数组有这么大...

[真,假,真,真,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假]

当您执行 boolArray.append(false) 时,您的错误在 cellForRowAtIndexPath 中。每次绘制单元格时都会调用 cellForrRowAtIndexPath: ,即使它之前已经绘制过。如果 indexPath.row 大于 boolArray 的长度,则可能的解决方法是仅附加 false,否则就是你的 'model',你只需检查它即可。

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

正如您从代码中看到的那样,重复使用了单元格。您需要保留所选单元格的状态,并在 var view = UITableViewCell ...

之后分配附属视图状态
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->    UITableViewCell{
var cell : UITableViewCell = .........
if(boolArray[indexPath.row){
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
    cell.accessoryType = UITableViewCellAccessoryType.None
}
}

试试这个代码。

NSMutableIndexSet 是用于跟踪选择状态的更好对象。

当您return indexPath

的单元格时,您还需要检查选择状态
var selectedCells = NSMutableIndexSet()

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath)      {

    var accessory=UITableViewCellAccessoryType.none

    if (selectedCells.containsIndex(indexPath.row) {
       selectedCells.removeIndex(indexPath.row)
    }
    else {
       selectedCells.addIndex(indexPath.row)
       accessory=.checkmark
    }

    if let cell = tableView.cellForRowAtIndexPath(indexPath) {

        cell.accessoryType = accessory
    }

}

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) ->    UITableViewCell
{
    var cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier:"CellTable")

     var accessory=UITableViewCellAccessoryType.none

     if (selectedCells.containsIndex(indexPath.row) {
         accessory = .checkmark
     }

     view.accessoryType=accessory

        return view
}

创建一个元组数组来存储行值和节值:

var selectedCells:[(row: Int, section: Int)] = []

在您的 cellForRowAtIndexPath 中,检查您是否有 selectedCellValues。如果是这样,为该单元格添加一个 accessoryType 并跳出循环,

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

    let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as SettingsCustomCell

    var rowNums:NSNumber = indexPath.row
    var sectionNums:NSNumber = indexPath.section

    var selectedRow:Int
    var selectedSection:Int

    if(selectedCells.count > 0){
        for tuple in selectedCells{

            selectedRow = tuple.row
            selectedSection = tuple.section

            if(selectedRow == rowNums && selectedSection == sectionNums){
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                break
            }else{
                cell.accessoryType = UITableViewCellAccessoryType.None
            }
        }
    }else{
        cell.accessoryType = UITableViewCellAccessoryType.None
    }

    var keyValue = listOfSectionTitles[indexPath.section]
    var items: [NSString] = dictionaryOfCellTitles.objectForKey(keyValue) as [NSString]

    cell.textLabel?.text = items[indexPath.row]
    return cell
}

didSelecteRowAtIndexPath 中处理 selectedcellvalues:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = tableView.cellForRowAtIndexPath(indexPath)

    if(cell?.accessoryType == UITableViewCellAccessoryType.None){
        cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
        selectedCells.append(row:indexPath.row, section:indexPath.section)
    }else{
        var rowToDelete = indexPath.row
        var sectionToDelete = indexPath.section

        for var i=0; i < selectedCells.count; i++
        {
            if(rowToDelete == selectedCells[i].row && sectionToDelete == selectedCells[i].section){
                selectedCells.removeAtIndex(i)
                cell?.accessoryType = UITableViewCellAccessoryType.None
            }
        }
    }
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}