2016-01-31 6 views
0

У меня есть таблица, которую я использую, которая показывает параметры часового пояса. Я использую галочку, чтобы показать, какой из них выбран в данный момент. Когда таблица создана, я устанавливаю флажок в ячейке, которая сохраняется в качестве часового пояса пользователя.Swift didDeselectRowAtIndexPath не работает с предустановленной ячейкой

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

     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cellData") 

     switch indexPath.row { 
      case 0: cell.textLabel?.text = "Eastern" 
      case 1: cell.textLabel?.text = "Central" 
      case 2: cell.textLabel?.text = "Mountain" 
      case 3: cell.textLabel?.text = "Mountain (No DST)" 
      case 4: cell.textLabel?.text = "Pacific" 
      default: cell.textLabel?.text = "" 
     } 

     cell.selectionStyle = UITableViewCellSelectionStyle.None 

     if(cell.textLabel?.text == keychain.get("timezone")) { 

      cell.accessoryType = UITableViewCellAccessoryType.Checkmark 

     } 

     return cell 
    } 

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

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

    tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = UITableViewCellAccessoryType.Checkmark 

} 

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

    tableView.cellForRowAtIndexPath(indexPath)!.accessoryType = UITableViewCellAccessoryType.None 

} 

Однако, когда я устанавливаю галочку, она не удаляется, когда я выбираю новый часовой пояс. Он будет работать, только если я его выберу, а затем выберем новый. Есть ли причина, по которой исходная ячейка не влияет на отмену выбора?

+0

Мое предположение заключается в том, что проверка 'accessoryType' - это просто« ментальный отбор », определенный вами, и это не имеет никакого отношения к реальному выбору. Вам может потребоваться выбрать строку примерно следующим образом: http://stackoverflow.com/questions/24787098/programmatically-emulate-the-selection-in-uitableviewcontroller-in-swift, только тогда 'didDeselectRowAtIndexPath' будет работать для вас. –

+0

@JoeHuang, когда я использую код из этого вопроса, я получаю сообщение об ошибке, что это nil in didSelect –

ответ

1

Причина, по которой ваша исходная ячейка не отменяется, заключается в том, что она не выбрана в первую очередь. Включение аксессуара флажка не выбирает ячейку.

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

Добавить переменную класса помнить ячейку, которая должна быть выбрана

var initiallySelectedPath: NSIndexPath?

Установить переменную в вашем cellForRowAtIndexPath (лично, я бы эту установку в другом месте в классе из-за того, как фактические ячейки выбор будет выполняться, но этого достаточно, чтобы продемонстрировать на решение хорошо.

... 
if (cell.textLabel?.text == keychain.get("timezone")) { 
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
    initiallySelectedPath = indexPath 
} 
... 

Тогда в вашем viewWillAppear

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    if let indexPath = initiallySelectedPath { 
    // I force unwrap (sorry!) my tableView, you'll need to change this to however you reference yours 
    tableView!.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None) 
    } 
} 

Теперь ваша первоначальная ячейка должна отменить выбор с помощью первого касания в другой ячейке.

+0

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

Смежные вопросы