Сценарий:
- У меня есть простой 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 :, не работает для достижения прокрутки нужной строки в представлении.
Это ошибка? Любая помощь или мысли будут оценены.