cellForRow(at: indexPath)
может вернуть nil, если ячейка не видна - и ячейка может быть не видна сразу после вызова selectRow. Поэтому я бы рекомендовал обновить реализацию didSelectRow, чтобы избежать принудительного развертывания as!
и быть более оборонительным:
if let cell = categoryListView.cellForRow(at: indexPath) as? CategoryCellView {
// do stuff with the cell
}
(или, возможно, использовать guard let
, если это имеет больше смысла)
Я бы рекомендовал , а не , непосредственно вызывая функции UITableView или UITableViewDelegate, такие как didSelectRow
(или другие стандартные функции делегата UIKit), из вашего собственного кода, поскольку это нарушает первоначальный контракт на разработку этих функций. Это может привести к ошибкам или нежелательному поведению, если вы вызываете didSelectRow непосредственно для объекта UITableView. Вместо этого напишите другую пользовательскую функцию в вашем классе, которая реализует UITableViewDelegate, где вы можете обновить соответствующий UITableViewCell после вызова selectRow. Вы могли бы вызвать эту же функцию из вашей реализации didSelectRow и, таким образом, повторно использовать некоторый код.
В зависимости от того, что вам нужно сделать с ячейкой в вашем методе didSelectRow, вы можете обратиться к сценарию программной c -выборки в другие способы. Например:
- В вашей реализации cellForRowAt вы можете проверить, является ли
indexPath == tableView.indexPathForSelectedRow
или tableView.indexPathsForSelectedRows?.contains(indexPath) ?? false
, чтобы определить, является ли ячейка, которая должна быть отображена, выбранной. Обратите внимание, что в этот момент значение ячейки isSelected может быть ложным. UITableView установит isSelected в true, если необходимо сразу после этого. Что приводит ко второму варианту: - Реализация
override func setSelected(_ selected: Bool, animated: Bool)
в вашем CategoryCellView, если вам просто нужно обновить внешний вид этой указанной c ячейки табличного представления. Если ячейка уже видна при вызове selectRow, setSelected будет вызвано немедленно. Если ячейка не видна во время вызова selectRow, setSelected будет вызываться в этой ячейке позже, сразу после вызова делегата tableView(_:,cellForRowAt:)
, когда пользователь прокручивает до этой ячейки