dequeueReusableCell (withIdentifier identifier: String, для indexPath: IndexPath), возвращая 2 разные ячейки при каждом вызове - PullRequest
0 голосов
/ 06 мая 2019

не знаю, сталкивались ли вы с такой ситуацией, я использую функцию

func tableView(_ tableView: UITableView, 
     cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
  let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ReusableCell.self), for: indexPath) as! ReusableCell 
  cell.reloadAction = { 
    tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none) 
  } 
  return cell 
}

для извлечения многоразовой ячейки. Но теперь каждый раз, когда я перезагружаю ячейку, снова вызываю эту функцию, и она возвращает 2 разные ячейки при каждом вызове. Я рисую ячейки на раскадровке, чтобы у меня не было возможности регистрировать ячейки несколько раз в коде. Если вы когда-либо сталкивались с этим делом, пожалуйста, помогите мне, я очень запутался :( Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Функция dequeueReusableCell не возвращает тот же экземпляр ячейки для заданного indexPath. Он возвращает ранее выделенный экземпляр ячейки, который в настоящее время не используется для повышения эффективности памяти, или новый, если он недоступен.

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

Вы можете кэшировать все ячейки самостоятельно и искать их, прежде чем запрашивать новые. Недостаточно памяти, но у вас всегда будет один и тот же экземпляр ячейки для IndexPath. Есть угловые случаи, когда собственный кеш имеет смысл. Со многими, многими записями в модели данных (скажем, список из 10000 песен) наилучшим способом является утилизация неиспользуемых (или не отображаемых) ячеек.

Как обновить ячейку тогда? Лучшая практика для перезагрузки ячеек в UITableView зависит от источника события, которое требует перезагрузки. Эти два события связаны либо с пользовательским интерфейсом, либо с моделью данных.

UI / User: Вы хотите перезагружать поведение из своей камеры? Затем позволяет ячейке запрашивать модель данных и обновлять ее содержимое. Ячейка может получить свой IndexPath как свойство вместе со слабой ссылкой на модель данных и запросить модель данных для самых новых данных. Или вы спрашиваете UITableViewDataSource, какой IndexPath принадлежит ячейке, чтобы выяснить, какие данные относятся к ней.

Модель данных: Зачем вычислять обновления, где их нет? Более распространенным и похожим на Apple способом было бы обновление при изменении данных. В этом случае модель данных узнает, что она была изменена, и инициирует обновление. В основном используется reloadData (), но вы также можете обновить все видимые ячейки в отдельном потоке. Для каждой ячейки вы можете использовать UITableViewDataSource, чтобы сообщить вам, какой у него IndexPath, и решить, нужно ли обновлять эту ячейку. Или каждая ячейка знает свой IndexPath и сама принимает решение об обновлении, если эти данные предназначены для этой ячейки.

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

0 голосов
/ 06 мая 2019

имя вашего идентификатора кажется странным (вам не нужно указывать его тип (String): это тот, который вы установили на панели конструктора интерфейса? Предлагаю вам проверить имя идентификатора и попробовать с кодомкак: withIdentifier: "myCell". Надеюсь, это поможет.

...