Прокрутка UITableView до невидимых разрывов обхода строк с помощью iOS 4.2 GM seed - PullRequest
1 голос
/ 04 ноября 2010

Сценарий: - У меня есть простой tableView в popover, который ограничивает его высоту до четырех видимых строк. Когда контроллер представления всплывающего окна инициализируется, массив источника данных таблицы может быть заполнен, например, 10 элементами. - Мой пользователь ранее выбрал одно из 10 значений элемента, которое сохраняется в основном объекте данных. - Когда контроллер представления всплывающего окна инициализируется, я сопоставляю выбранное пользователем значение основных данных со значением массива источника данных и сохраняю индекс в свойстве строки свойства NSIndexPath viewController с именем selectedIndexPath. - Затем, когда таблица загружается, я отмечаю ячейку в selectedIndexPath.row и прокручиваю ее до UITableViewScrollPositionTop.

История: Мне никогда не удавалось получить ни tableView: scrollToRowAtIndexPath: atScrollPosition: animated:, ни scrollRectToVisible: animated: для этого ни из методов viewController viewWillAppear:, ни из методов viewDidLoad. После долгих поисков и экспериментов я нашел обходной путь, который сработал. Я вызвал этот метод из viewController viewWillAppear:

(void)updateContentOffsetForTableView:(UITableView *)tbl withIndexPath:(NSIndexPath *)indexPath {

// Get rect of selected row from which to calculate origin point
CGRect rowRect = [tbl rectForRowAtIndexPath:indexPath];

// Get point of origin of selected row rect
CGPoint ptOffset = CGPointMake(rowRect.origin.x, rowRect.origin.y);

// Set tableView superclass scrollView.contentOffset property with selected row origin     
tbl.contentOffset = ptOffset;

 // Note: the cell checkmarking is done in tableView:cellForRowAtIndexPath:

}

Передача tableView и свойства selectedIndexPath. Опять же, это сработало как нужно: например, 10-й элемент в массиве источника данных будет сопоставлен со значением основных данных, индексом, сохраненным в selectedIndexPath.row, и вышеуказанным методом, вызываемым со строкой tableView и selectedIndexPath, и tableView будет прокручивается, чтобы содержать отмеченную галочкой строку.

Проблема: С выпуском 4.2 GM требуемая прокрутка больше не работает - только четыре ячейки tableView отображаются для первых четырех значений в массиве источника данных. Например, ячейка в 10-й строке будет по-прежнему отмечена, как и раньше, но прокрутка этой нижней строки не будет достигнута.

Обратите внимание, что метод временного решения ранее работал только при вызове из viewWillAppear: а не из viewDidLoad. С выпуском 4.2 GM семян, указанный выше обходной путь больше не работает.

Это в приложении для iPad. Я использую недавно выпущенный Xcode 3.2.5 и iOS SDK 4.2 GM seed (Snow Leopard). Я убедился, что при сборке для iOS SDK 3.2 Simulator и Device вышеуказанный код работает. При сборке для iOS SDK 4.2 GM Simulator и устройства ни один из следующих компонентов: приведенный выше код, tableView: scrollToRowAtIndexPath: atScrollPosition: animated: или scrollRectToVisible: animated :, не работает для достижения прокрутки нужной строки в представлении.

Это ошибка? Любая помощь или мысли будут оценены.

1 Ответ

2 голосов
/ 06 ноября 2010

Предложение пользователя форумов разработчиков Apple предоставило работающее решение:

Это работает для 4.2 GM seed, Simulator и Device, больше не зависит от хака UIScrollView.contentOffset.

В представлении контроллера viewWillAppear: метод:

(void)viewWillAppear:(BOOL)animated {
if (self.savedIndexPath) {
    [self performSelector:@selector(displayRowAtSelectedIndexPath:) withObject:self.savedIndexPath afterDelay:0.0];
}

}

вызов:

(void)displayRowAtSelectedIndexPath:(NSIndexPath *)indexPath {

if (indexPath == self.savedIndexPath) {
    [self.myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

}

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