UItableview scrollToRowAtIndexPath не отображает последнюю строку правильно

У меня есть таблица с настраиваемыми ячейками с динамической высотой ячейки в зависимости от содержимого ячейки.

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

Вот код:

[self.tableView reloadData];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES ];

Это ошибка iOS? любой обходной путь?

 vishy23 окт. 2012 г., 14:27
ты пробовал этот код в?viewDidAppear
 HpTerm23 окт. 2012 г., 20:50
мы могли бы удалить настоящие комментарии для чистоты
 Brooks Hanes22 дек. 2015 г., 16:06
Смотрите такжеstackoverflow.com/questions/12514770/...
 vishy23 окт. 2012 г., 16:47
я добавил это как ответ, проверьте разницу обоих методов ..

Ответы на вопрос(2)

[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
        NSIndexPath *rowIndexPath = [NSIndexPath indexPathForRow:3 inSection:0];
        [self.tableView scrollToRowAtIndexPath:rowIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
});

почему, но я думаю, что этот подход работает, потому что когда мы добавляем (???) строки и вызываем [tableView reloadData] tableView не успевает обновить некоторые внутренние счетчики (например, счетчик строк) и вызывает [tableView scrollToRowAtIndexPath ...] не имеет никакого эффекта, так как в это время такой строки нет (опять же, вероятно, правильно, если выдобавлять строки или установить tableView 'данные впервые). призвание

dispatch_async(dispatch_get_main_queue(), ^{
    ...
}); 

после того, как [tableView reloadData] дает tableView достаточно времени, чтобы обновить счетчик строк и выполнить прокрутку до существующей строки.

Vishy»подход работает только потому, что дает достаточно времени, но применимо, только если вам нужно прокрутить ровно один раз при загрузке экрана. Более того, для проверки каждый раз viewDid / WillAppear требуется некрасивый флаг.

Решение Вопроса

Все операции, использованные доview отображается на экране инициализированы вviewDidLoad все объекты пользовательского интерфейса, объекты данных могут быть выделены и инициализированы в этом методе.

Все модификации данных операций, изменения пользовательского интерфейса, сделанные дляview нужно сделать вviewDidAppear, Или даже некоторые операции могут быть сделаны в.viewWillAppear

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

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

 Fyodor Volchyok24 февр. 2015 г., 11:37
Что бы вы сделали, если вам нужно обновить контент, не покидая экрана? В этом случае мы не можем полагаться на viewDidLoad.
 vishy24 февр. 2015 г., 13:34
@FyodorVolchyok в этом случае таблица уже загружена, поэтому ее будет легко прокрутить из любого места.

Ваш ответ на вопрос