UITableView Checkmarks disappear when scrolling

前端 未结 5 1691
一整个雨季
一整个雨季 2020-11-30 08:38

I have to make checkmarks on a tableView, but if I\'m scrolling and one check marked cell is not visible and I scroll back the checkmark disappeared.

While running

相关标签:
5条回答
  • 2020-11-30 08:48
    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.

    0 讨论(0)
  • 2020-11-30 08:52

    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)
    }
    
    0 讨论(0)
  • 2020-11-30 08:59
     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 ...

    0 讨论(0)
  • 2020-11-30 09:03

    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
    }
    
    0 讨论(0)
  • 2020-11-30 09:05

    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.

    0 讨论(0)
提交回复
热议问题