2016-03-17 4 views
2

Я хочу, чтобы ячейка оставалась выбранной, когда она касалась, и если она коснулась снова, чтобы ее отменить. Это мой код, который не работает:Как сохранить ячейку, выбранную при прокрутке таблицыView?

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let selectedCell = tableView.cellForRowAtIndexPath(indexPath) 
    if let value = selectedCell?.selected.boolValue { 
     if !value { 
      print("cell was selected and will remain selected") 
      selectedCell?.selected = true 
     } else { 
      print("cell is deselected") 
      selectedCell?.selected = false 
     } 
    } 
} 

Как это реализовать?

+0

Вам нужно будет сохранить состояние ячейки в массиве, а затем использовать его в cellForRowAtIndexPath, чтобы различать, какая ячейка должна быть выбрана, а какая нет. –

+0

И как отменить выбор выбранного после. Сейчас я просто хочу заставить его работать в одной ячейке.Но идея массива будет необходима, поскольку у меня есть целое меню, которое я реализую для работы с этой функцией. – irkinosor

+0

Вам нужно реализовать didSelectRowAtIndexPath и didDeselectRowAtIndexPath, –

ответ

1

Запомните правила:

  • клетка хранят данные в модели
  • UITableViewController только для визуализации

На вашем коде, сделать хранение выбранного значения, например, в массиве, по indexPath.row

+0

Да, я знаю, но просто хочу указать визуально, что этот вариант действительно был сохранен в модели данных. Я не хочу использовать тип аксессуара для реализации, который из-за некоторых конструктивных ограничений – irkinosor

+0

@irkinosor вам не нужно использовать для этого тип аксессуара. Вы можете просто перерисовать фон ячейки, если он был выбран. – dimpiax

0

Вы можете установить значение тега по умолчанию для каждой ячейки в cellForRowAtIndex как cell.tag = 0

Внутри функции didSelectRowAtIndexPath вы можете сделать что-то вроде этого

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

    let selectedCell = tableView.cellForRowAtIndexPath(indexPath) 
    if selectedCell.tag == 0 { 
     print("cell was selected") 
     selectedCell.tag = 1 
    } 
    else { 
     print("cell was deselected") 
     selectedCell.tag = 0 
    } 

} 
+0

Это не работает, потому что загрузка таблицы из cellForRowAtIndexPath без выбранной ячейки. – irkinosor

+0

@irkinosor надеется, что это решает вашу проблему. – MrDank

+0

Спасибо, но нет. Оцените усилия! – irkinosor

0

, если все, что вы когда-либо один выбранный ряд в то время, то даже без модели данных (которые вы должны), вы могли бы иметь атрибут ViewController selectedRowIndex который обновляется каждый раз, когда вы выбираете строку, и освежить Tableview - как часть cellForRowAtIndexPath вы можете проверить, если indexPath.row == selectedRowIndex и сделать все, что визуальные изменения вам нужно

определить атрибут для отслеживания текущей выбранной строки

var selectedRowIndex = -1 

затем обновить этот атрибут, когда пользователь выбирает строку

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    // build up an array of rows to be refreshed 
    // the previously selected row (if any) 
    // and the current one 
    var indexPaths : [NSIndexPath] = [] 

    // if a row was previous selected, clear the display 
    if selectedRowIndex != -1 
    { 
     indexPaths.append(NSIndexPath(forRow: selectedRowIndex, inSection: 0)) 
    } 

    selectedRowIndex = indexPath.row 
    indexPaths.append(NSIndexPath(forRow: selectedRowIndex, inSection: 0)) 

    // now refresh just those rows 
    self.tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None) 

} 

, а затем сделать что-то с ним, когда строка перерисовывается

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyCell 

    if indexPath.row == selectedRowIndex 
    { 
     cell.backgroundColor = UIColor.greenColor() 
    } 
    else 
    { 
     cell.backgroundColor = UIColor.whiteColor() 
    } 
     // everything else 
    return cell 
} 
+0

cellForRowAtIndexPath получить вызов только один раз? когда таблица загружается в первый раз. Но я хочу, чтобы этот ярлык/unhighlight происходил в интерактивном режиме, как будто он работал бы на аксессуар типа checmark – irkinosor

+0

Выполняйте корректировки галочки в функции 'willDisplayCell', а не в' cellForRowAtIndexPath'. – Koen

+0

Спасибо, Русел, но я боюсь, что ты не понимал мою проблему должным образом. и помните, что cellForRowAtindexPath получают вызов только в начале. И я хочу, чтобы ячейка была подсвечена/подсвечена сразу же, как пользователь нажимает на ячейку. – irkinosor

0

хорошо, это то, как мне удается объявите var selectedIndexPath: NSIndexPath?, а затем в файле didSelectRowAtindexPath выполнили следующее:

  if selectedIndexPath == indexPath { 
       tableView.deselectRowAtIndexPath(indexPath, animated: true) 
       selectedIndexPath = nil 
      }else{ 
       tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: .None) 
       selectedIndexPath = indexPath 
      } 
+0

Есть ли причина, по которой вы не используете метод 'didDeselectRowAtIndexPath:'? –

0

Мое понимание того, что выбор и отбор ячеек обрабатываются по умолчанию - вам не обязательно связываться с выбранными значениями ячеек самостоятельно!

Возможно, вам потребуется обновить некоторые элементы ячейки в методе tableView:cellForRowAtIndexPath: на основе выбранного состояния.

Если это не работает из окна и/или вы хотите настроить это поведение, вы также должны посмотреть на метод tableView:didDeselectRowAtIndexPath:. Комбинация этих двух методов должна позволять вам полностью контролировать выбранное состояние.

+0

спасибо человеку. Я уже опубликовал решение. – irkinosor