情景: - 我在弹出窗口中有一个普通的tableView,它将高度限制为四个可见行。当弹出视图控制器被初始化时,表数据源阵列可以填充有例如10个元素。 - 我的用户之前已选择了核心数据对象中持久存储的10个元素值之一。 - 初始化弹出窗口视图控制器时,我将用户选择的核心数据值与数据源数组值匹配,并将索引保存到名为selectedIndexPath的NSIndexPath viewController属性的row属性中。 - 然后当表加载时,我在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调用。随着转基因种子的发布,上述解决方法不再适用。
这是在iPad应用中。我正在使用最近发布的Xcode 3.2.5和iOS SDK 4.2 GM种子(Snow Leopard)。我已经验证,当我为iOS SDK 3.2模拟器和设备构建时,上面的代码可以工作。在为iOS SDK 4.2 GM Simulator和Device构建时,没有:上面的代码,tableView:scrollToRowAtIndexPath:atScrollPosition:animated:或scrollRectToVisible:animated:,用于实现将所需的行滚动到视图中。
这是一个错误吗?任何帮助或想法将不胜感激。
答案 0 :(得分:2)
Apple开发者论坛用户的建议提供了一个可行的解决方案:
这适用于4.2 GM种子,模拟器和设备,不再依赖于UIScrollView.contentOffset hack。
在视图控制器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];
}
}