scrollToRowAtIndexPath прокручивает вторую последнюю строку вместо последней - PullRequest
0 голосов
/ 20 июня 2011

У меня есть messagesTableView, который отображается в ViewController в NavigationController.

В viewDidLoad:

[self.messagesTableView reloadData];
NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
    NSLog(@"ViewDidLoad: number of rows:%d Messages Count:%d", t, [messages count]);
    NSIndexPath* ip = [NSIndexPath indexPathForRow: (t-1) inSection:0];
    [self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionNone animated:NO];
}

As you can see, the last row is partially shown

и в viewDidAppear:

[self.messagesTableView reloadData];

NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
    NSLog(@"ViewDidAppear: number of rows:%d Messages Count:%d", t, [messages count]);
    NSIndexPath* ip = [NSIndexPath indexPathForRow: (t - 1) inSection:0];
    [self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

The last is shown completely

scrollToRowAtIndexPath в viewDidLoad прокручивает до второй последней строки вместо последней строки, тогда как та же функция в viewDidAppear прокручивает до последней строки. Единственная проблема заключается в том, что для вызова функции viewDidAppear требуется некоторое время.

но почему он ведет себя по-разному в viewDidLoad и viewDidAppear (NSLog печатает одинаковые значения для обоих)?

Ответы [ 2 ]

1 голос
/ 20 июня 2011

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

Я думаю, что viewDidLoad вызывается после loadView, но перед layoutSubviews табличного представления. Представление таблицы дополнено координатами, не учитывающими панель навигации на данном этапе. Затем, когда viewController выдвигается, есть еще один setFrame, вызываемый navigationController, чтобы подогнать представление контроллера tableView к его области. Это смещает вид таблицы вниз примерно на 44 пункта, в результате чего нижняя ячейка исчезает.

Все это изменение размера завершено в viewWillAppear, так что это лучшее место для этого.

0 голосов
/ 05 августа 2014

Просто введите ваш scrollToBottom код:

[self.messagesTableView reloadData];
NSInteger t;
if ((t = [self.messagesTableView numberOfRowsInSection:0]) > 0) {
    NSLog(@"ViewDidLoad: number of rows:%d Messages Count:%d", t, [messages count]);
    NSIndexPath* ip = [NSIndexPath indexPathForRow: (t-1) inSection:0];
    [self.messagesTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionNone animated:NO];
} 

в -(void)viewWillLayoutSubviews метод;

И учтите, что обязательно animated:NO;

...