2015-01-13 4 views
2

Мне нужно сделать галочки в таблицеView, но если я прокручиваю и одна отмеченная чекейка не видна, и я прокручиваю назад галочку.UITableView Checkmarks исчезают при прокрутке

При выполнении этого кода

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 

} 

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

[истина, ложь, правда, правда, правда, ложь, ложь , false, false, false, false, false, false, false, false, false]

ответ

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

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

+0

Спасибо. Оно работает. :-) –

+0

Ты забыл] после indexPath.row – f1rstsurf

0

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

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

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

1

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

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

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