2017-02-07 1 views
0

Я новичок в Swift, и я хочу отключить выбор нескольких строк в моем представлении таблицы. Я пытаюсь реализовать различные типы подходов, и мой последний блок кода ниже, который не работает. Спасибо за помощь.Отключение выбора строки Mutliple в Tableview в Swift

override func viewDidLoad() { 
     super.viewDidLoad() 
     companyTableView.allowsMultipleSelection = false 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     if let cell = tableView.cellForRow(at: indexPath) { 
      cell.accessoryType = .checkmark; 
     } 

     tableView.deselectRow(at: indexPath, animated: true) 
     if let cell = tableView.cellForRow(at: indexPath) { 
      cell.accessoryType = .checkmark 
     } 

     tableView.deselectRow(at: indexPath, animated: true) 
     if let cell = tableView.cellForRow(at: indexPath) { 
      if selectedCells.contains(indexPath.row) { 
       selectedCells.remove(indexPath.row) 
       cell.accessoryType = .none 
      } else { 
       selectedCells.insert(indexPath.row) 
       cell.accessoryType = .checkmark 
      } 
     } 
    } 
+2

'allowsMultipleSelection = false' работает нормально. –

+0

По умолчанию одиночный выбор выбирается только в раскадровке. В раскадровке -> выберите свой табличный просмотр, а при указателе атрибута есть опция выбора «Нет», «Один выбор», «Множественный выбор». Если вы не хотите менять его во время выполнения, вы можете установить его из раскадровки. Также значение по умолчанию для 'allowMultipleSelection' также является ложным. – Priyal

+1

Показать код 'cellForRowAtindexPath'. –

ответ

0

Пожалуйста, попробуйте этот код:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     if !selectedCells.contains(indexPath){ 
      selectedCells.add(indexPath) 

      if let cell = tableView.cellForRow(at: indexPath) { 
       cell.accessoryType = .checkmark 
      } 
     } 
    } 


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 

     if selectedCells.contains(indexPath){ 
      selectedCells.remove(indexPath) 

      if let cell = tableView.cellForRow(at: indexPath) { 
       cell.accessoryType = .none 
      } 
     } 
    } 

И в cellForRowAt использует это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     if selectedCells.contains(indexPath){ 
       cell.accessoryType = .checkmark 
     } 
     else{ 
      cell.accessoryType = .none 
     } 

     return cell 
    } 
+0

Эй, поляки, я уже выбрал «Single Selection» в Storyboard, но это не решило мою проблему. – gozdebal

+0

Тогда я думаю, что проблемы лежат в части кода 'didSelectRowAt'. Ваш единственный выбор работает, но, как вы устанавливаете галочки, есть некоторые ошибки. – Poles

+0

@gozdebal: Пожалуйста, проверьте мой обновленный код. – Poles

0

Там, кажется, проблема в вашем выборе/отмене вызова. Используйте что-то вроде этого: Вот у меня есть массив selectedCells (размер которых равно числу от общего числа клеток)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark 
     if filteredStudents.count > indexPath.row { 
      selectedCells[indexPath.row] = true 
     } 
    } 

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
     tableView.cellForRow(at: indexPath)?.accessoryType = .none 
     if selectedStudents.count > indexPath.row { 
      selectedCells[indexPath.row] = false 
     } 
    } 
Смежные вопросы