UITableView прокрутка до определенной позиции - PullRequest
8 голосов
/ 21 апреля 2010

Я использую iPhone SDK 3.1.3. У меня есть UITableViewController, который получает данные от другого контроллера. Табличное представление добавляется как подпредставление к основному виду, но фрейм установлен так, что он не виден. Рамка табличного представления обновляется и перемещается по основному виду нажатием кнопки.

Появится табличное представление, и я перейду к последней строке. Если я выберу последнюю строку, я перезагрузлю таблицу с большим количеством данных. Таблица обновляется с большим количеством данных. Все отлично работает, кроме позиции прокрутки всегда сверху.

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

 [theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:savedScrollPosition animated:NO];

Вышеупомянутое, кажется, не имеет никакого эффекта. ViewWillAppear: ViewDidAppear: не запускается, и мне говорят, что, если контроллер представления создается в коде, что имеет место, они не запускаются. Пожалуйста, помогите мне выяснить, как и когда устанавливать позицию прокрутки после перезагрузки таблицы ([theTableView reloadData]), чтобы она находилась в строке, по которой я щелкнул.

Код для перезагрузки просмотра таблицы и прокрутки

 ////performAction will notify the tableviewcontroller which will result in didPerformAction being called
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     if (indexPath.row == lastRow)
     {
       savedScrollPosition = lastRow;
       //perform the action
       [controller performAction];
     }
}

- (void) didPerformAction:(NSNotification *)obj
{
  [theTableView reloadData];
  [theTableView
     scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:savedScrollPosition inSection:0]
     atScrollPosition:UITableViewScrollPositionBottom 
     animated:NO];
}

Ответы [ 3 ]

31 голосов
/ 22 апреля 2010

Казалось, это сработало.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
CGPoint point = theTableView.contentOffset;
point .y -= theTableView.rowHeight;
theTableView.contentOffset = point;
10 голосов
/ 22 апреля 2010

Это будет выглядеть лучше, и положение прокрутки останется фиксированным, если вы можете вставить строки вместо вызова reloadData.

[theTableView beginUpdates];
[theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation];
// make sure the dataSource will return new rows before calling endUpdates
[theTableView endUpdates];

Вместо использования прокрутки UITableView вы можете использовать прокрутку UIScrollView:

savedOffset = [theTableView contentOffset];

Затем восстановите:

[theTableView setContentOffset:savedOffset];
0 голосов
/ 21 апреля 2010

Если это реальный код и предполагается, что в нем нет значения nable, то вы должны получить предупреждение «возможно, не отвечает ...», поскольку scrollToRowAtIndexPath написано неправильно.

Во-вторых, параметр atScrollPosition ожидает UITableViewScrollPosition Значение перечисления, указывающее, где на экране вы хотите расположить целевую строку.

Попробуйте это:

[theTableView scrollToRowAtIndexPath:
                [NSIndexPath indexPathForRow:savedScrollPosition inSection:0]
                atScrollPosition:UITableViewScrollPositionBottom 
                animated:NO];
...