UITableView Checkmarks disappear when scrolling

做~自己de王妃 提交于 2019-11-27 04:34:38
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->    UITableViewCell{
var cell : UITableViewCell = .........
if(boolArray[indexPath.row){
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
    cell.accessoryType = UITableViewCellAccessoryType.None
}
}

Try this code.

Susheel Athmakuri

Create an Array of tuples to store row and section values:

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

In your cellForRowAtIndexPath, check if you have any selectedCellValues. If so, add an accessoryType for that cell and break out of the loop,

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
}

Handle selectedcellvalues in didSelecteRowAtIndexPath:

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)
}

An NSMutableIndexSet is a better object to use to track selection status.

You also need to check the selection status when you return the cell for an 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
}
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->    UITableViewCell

reuses cells as you can see from the code. You need to keep the state of your selected cells, and assign the accessory views state after var view = UITableViewCell ...

Your error is in cellForRowAtIndexPath when you do boolArray.append(false). cellForrRowAtIndexPath: is called every time a cell will be drawn even if it has been drawn before. A possible fix is only appending false if indexPath.row is greater than the length of boolArray, otherwise it is your 'model' and you just check it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!