Вызывающий номерOfRowsInSection: from heightForRowAtIndexPath - PullRequest
13 голосов
/ 08 декабря 2010

Только что обнаружил очень странное и неожиданное поведение в классе UITableView.Мне нужно, чтобы последняя ячейка таблицы в моем разделе отличалась по высоте от других ячеек, поэтому я делаю в основном следующее:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1)
        return 44;
    else
        return 88; //double size for all but the last row
}

Кажется довольно простым, но когда я запускаю ее, я получаюбесконечный цикл, и он падает.Я определил, что когда я вызываю numberOfRowsInSection:, он вызывает метод tableView: numberOfRowsInSection: моего источника данных.Это имеет смысл, поскольку метод tableView возвращает кэшированную версию значения источника данных, поэтому он должен получить значение из источника данных в первый раз.Но затем он вызывает heightForRowAtIndexPath, снова передавая ему indexPath [0, 0]!И он делает это без остановки.

Я смог обойти это, используя вместо этого

[self tableView:tableView numberOfRowsInSection:indexPath.section]

(вызывая мой метод источника данных вместо метода tableView).У кого-нибудь есть идеи, почему это происходит?Это определенное поведение?Или ошибка в Apple TableView Framework?

1 Ответ

17 голосов
/ 20 января 2011

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

Вы неправильно понимаете схему M-V-C, на которой Apple основывает свои элементы управления. Ответ на высоту строки должен исходить от вашей модели, а НЕ от обратного вызова в классе представления. Это приводит к тому, что класс представления запрашивает дополнительную информацию (для создания своего внутреннего кэша), который запускает набор рекурсивных вызовов.

Убедитесь, что все методы делегата источника данных возвращают данные из вашей модели и не полагаются на кэширование представления. Если вы отлаживаете какое-либо представление на основе источника данных, вы удивитесь, сколько раз UITableView запрашивает данные. Но именно так Apple и кодировала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...