didSelectRowAtIndexPath не отвечает на клики

#swift #uitableview

#swift #uitableview

Вопрос:

Я создаю приложение для редактирования для учащихся старших классов. В этом представлении пользователь должен иметь возможность выбирать единицы, которые они хотят изучать по определенному предмету, а путь индекса выбранных единиц будет сохранен в массиве int и передан следующему представлению для отображения изображений. К сожалению, didSelectRowAt метод по какой-то причине не отвечает.

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

 var units = [String]()
var selectedRows = [Int]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return units.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "unitCell", for: indexPath) as! UnitCell
    cell.textLabel?.text = units[indexPath.row]
    return cell
}

func tableView(tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selectedRows.append(indexPath.row)
    print(selectedRows)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destination = segue.destination as! ImageView
    destination.folderNames = selectedRows
}
  

Я ожидаю, что будет получен массив индексов строк выбранных ячеек. Но сейчас он просто пустой.

Комментарии:

1. Можете ли вы проверить, вызываются ли другие методы делегирования или нет?

2. Да, это так, ячейки настроены правильно, и пустой массив передается в следующее представление через prepareforsegue @KeyurTailor

3. @TimmyMi как вы выполняете переход, не могли бы вы показать нам код.

4. @MuhammadWaqasBhati извините, я новичок в stack overflow, как мне поделиться кодом в области комментариев?

5. @TimmyMi отредактируйте свой ответ, было бы неплохо.

Ответ №1:

Если код, который вы показываете в своем вопросе, точен, подпись didSelectRowAt метода неверна. Это должно быть:

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

  

Обратите внимание на начало «_» для первого параметра. Если ваш класс является UITableViewController, вам также необходимо добавить override ключевое слово.

Если ваш код уже использует эту подпись, пожалуйста, обновите свой вопрос, чтобы отразить это.

Кроме того, этот ведущий код не может быть правильным. Пожалуйста, обновите его до того, что вы на самом деле используете,

var units = String var selectedRows = Int

Ответ №2:

Вы должны использовать метод делегирования

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

Вместо вашего существующего

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath)
  

Попробуйте и поделитесь своими результатами.

Комментарии:

1. По-прежнему ничего не напечатано, я думаю, проблема в том, что метод не вызывается, когда я нажимаю на свою ячейку.

Ответ №3:

  • Во-первых, ваш didSectRow устарел, поэтому, пожалуйста, используйте приведенный ниже

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
      
  • Во-вторых, вы должны настроить свой делегат TableView на Self, как показано ниже

     tableView.delegate = self
      

Комментарии:

1. @TimmyMi Хорошо, конечно, если вы столкнетесь с какой-либо проблемой, дайте мне знать

2. К сожалению, все еще ничего не напечатано или не передано в следующий просмотр.

3. Хм … не могли бы вы отредактировать свой вопрос и показать мне код вашего контроллера, куда вы добавили мои инструкции.

4. Хорошо, я только что отредактировал код в своем вопросе, пожалуйста, проверьте, спасибо orz

5. @TimmyMi где вы инициализируете свои выбранные строки, например, var selectedRows = [Int]() ? …. Я не смог увидеть это в вашем коде