Разница заключается в следующем:
dataSource.cellForRowAtIndexPath(indexPath)
cellForRowAtIndexPath
- это метод, который ваш источник данных предоставляет UITableView
. Это вызвано iOS, чтобы загрузить ячейку для определенного indexPath
. Он работает путем удаления очереди из многократно используемой ячейки и заполнения информации для этой ячейки.
Вы обычно не называете это. iOS делает.
cellForRow(at: indexPath)
Этот метод предоставляется iOS для возврата ячейки для определенного indexPath
, если эта ячейка в данный момент отображается на экране, или nil
, если ячейка не отображается на экране.
Этот метод предназначен для вызова, если у вас есть indexPath
и вам нужна соответствующая ячейка.
Ваша ошибка происходит из-за того, что вы звоните cellForRowAtIndexPath
, который освобождает многократно используемую ячейку для выполнения своей работы. Ячейка уже находится на экране и уже имеет связанную с ней ячейку, так что теперь их две, что не имеет смысла.