2016-08-16 3 views
1

Я всегда обновил UITableViewCell содержание в tableView:cellForRowAtIndexPath: так:Правильное место для обновления содержания UITableViewCell

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

    let cell:UITableViewCell = self.resultsTableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as UITableViewCell! 

    // update cell content 
    cell.backgroundColor = UIColor.clearColor() 
    cell.textLabel?.text = myTextString 

    return cell 
} 

documentation также показывает содержание обновляемой в tableView:cellForRowAtIndexPath:. Однако сегодня I read

Содержимое ячейки необходимо установить прямо перед ее отображением. Нам все равно, какой объект ячейки используется. Все, о чем мы заботимся, это то, что у него есть подходящий материал для отображения, когда он передается визуализатору. Таким образом, правильное место, чтобы установить содержание ячейки является tableView:willDisplayCell:forRowAtIndexPath:

Причина этого упоминается в the same post. Он говорит о

... проблема, когда пользовательская ячейка «случайно изменяет содержимое» при прокрутке таблицы. Причина, по которой это происходит, заключается в том, что содержимое ячейки установлено в методе tableView:cellForRowAtIndexPath:, что не является подходящим местом. В этом методе система ожидает только получить объект ячейки. После отображения ячейки система не будет запрашивать объект ячейки до тех пор, пока она не потеряет ее (т. Е. Когда объект ячейки будет уничтожен) и не сможет найти замену для повторного использования. Если, однако, найдена замена, она будет повторно использована, и вы в конечном итоге увидите содержимое этой повторно используемой ячейки вместо исходной ячейки.

Это правильно? Я никогда не замечал проблемы раньше, но должен ли я обновлять содержимое моей ячейки в tableView:willDisplayCell:forRowAtIndexPath:? Я был введен в заблуждение в документации?

+0

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

ответ

1

Заявление неверно.

пользовательские ячейки, как представляется, «случайным образом изменить содержание», когда таблица прокручивается

происходит только тогда, когда

  • dequeueReusableCellWithIdentifier является (MIS) используются за пределами cellForRowAtIndexPath.
  • Весь контент ячейки не установлен надежно для определенного состояния внутри cellForRowAtIndexPath.
  • Содержимое ячейки управляется за пределами cellForRowAtIndexPath.

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

Так что это нормально и для поставки ячейки, и для обновления содержимого в cellForRowAtIndexPath.

PS: Я думаю willDisplayCell:forRowAtIndexPath: это унаследованный метод подходит из сот на основеNSTableView в MacOS, где методы делегата исходных данных не поддерживают, чтобы изменить внешний вид ячейки.

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