2017-02-17 4 views
1

Как:В чем разница между методами UITableView и эквивалентными методами UITableViewDatasource?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

отличается от:

func cellForRow(at indexPath: IndexPath) -> UITableViewCell?

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

func forRows(inSection section: Int, condition: (UITableViewCell) ->()) { 

    for row in 0..<numberOfRows(inSection: section) { 
     let cell = cellForRow(at: IndexPath(row: row, section: section))! 

     condition(cell) 
    } 
} 

^^^ не работает, ячейка равна нулю на последней строке

func forRows(inSection section: Int, condition: (UITableViewCell) ->()) { 

    for row in 0..<dataSource!.tableView(self, numberOfRowsInSection: section) { 
     let cell = dataSource!.tableView(self, cellForRowAt: IndexPath(row: row, section: section)) 

     condition(cell) 
    } 
} 

^^^ работает. Я понял, но я этого не понимаю.

В чем разница между методами делегата tableView и их эквивалентными методами на самом TableView?

ответ

2

Источник данных предназначается для обеспечить клетки, создавая их, как вы хотите, чтобы создать их. Обычно это связано с выделением повторно используемых ячеек или созданием новых.

Когда вы вызываете cellForRow(at indexPath: IndexPath) на вид таблицы, он дает вам ячейку, которая уже существует, если таковая есть.

+0

И ячейка, возвращаемая вызовом 'UITableView cellForRow (at:)', является ячейкой, которая представляет собой представление таблицы, вызванное вызовом 'tableView (_: cellForRowAt:)' в его источнике данных. – rmaddy

+0

спасибо за разъяснение, перепутал его в вопросе, исправил его, чтобы отразить это. –

1
  • делегат метод (строго говорил UITableViewDataSource также делегат) называется каркасом попросить что-то или указать конкретный этап в процессе.
    Вы не должны сами делегировать методы делегирования.

  • A класс или пример способ можно использовать беззаботно.

0

Я не знаю, если это ваш конкретный сценарий, так как мне нужно больше информации, но

func cellForRow(at indexPath: IndexPath) -> UITableViewCell? 

возвращается nil если ячейка не видна на экране. В другом методе таблица будет «нагрузка» для вас ячейка на конкретном индексного пути

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