Галочки UITableView исчезают при прокрутке

Мне нужно поставить галочки в 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

}

После небольшой прокрутки и установки галочки напечатанный массив становится таким большим...

[правда, ложь, правда, правда, правда, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь]


person Michael Krautsieder    schedule 13.01.2015    source источник


Ответы (5)


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->    UITableViewCell{
var cell : UITableViewCell = .........
if(boolArray[indexPath.row){
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
    cell.accessoryType = UITableViewCellAccessoryType.None
}
}

Попробуйте этот код.

person Nhut Duong    schedule 13.01.2015
comment
Вы забыли ] после indexPath.row - person f1rstsurf; 18.01.2016

Создайте массив кортежей для хранения значений строки и раздела:

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
}

Ручка selectedcellvalues в 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)
}
person Susheel Athmakuri    schedule 13.03.2015

Объект NSMutableIndexSet лучше использовать для отслеживания статуса выбора.

Вам также необходимо проверить статус выбора, когда вы возвращаете ячейку для 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
}
person Paulw11    schedule 13.01.2015

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

повторно использует ячейки, как вы можете видеть из кода. Вам нужно сохранить состояние выбранных вами ячеек и назначить состояние дополнительных представлений после var view = UITableViewCell ...

person ugur    schedule 13.01.2015

Ваша ошибка находится в cellForRowAtIndexPath, когда вы делаете boolArray.append(false). cellForrRowAtIndexPath: вызывается каждый раз при отрисовке ячейки, даже если она уже рисовалась раньше. Возможное исправление заключается в добавлении false только в том случае, если indexPath.row больше длины boolArray, в противном случае это ваша «модель», и вы просто проверяете ее.

person fpg1503    schedule 13.01.2015