使用iOS 4.2 GM种子将UITableView滚动到不可见的行变通方法中断

时间:2010-11-04 19:10:20

标签: uitableview ios ipad

情景:   - 我在弹出窗口中有一个普通的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:,用于实现将所需的行滚动到视图中。

这是一个错误吗?任何帮助或想法将不胜感激。

1 个答案:

答案 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];
}

}