UITableView滚动到特定位置

时间:2010-04-21 18:29:15

标签: iphone uitableview scroll uiscrollview

我正在使用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 个答案:

答案 0 :(得分:31)

这似乎可以解决问题。

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
CGPoint point = theTableView.contentOffset;
point .y -= theTableView.rowHeight;
theTableView.contentOffset = point;

答案 1 :(得分:10)

如果您可以插入行而不是调用reloadData,它看起来会更好并且滚动位置将保持固定。

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

您可以使用UIScrollView滚动来代替使用UITableView滚动:

savedOffset = [theTableView contentOffset];

然后恢复:

[theTableView setContentOffset:savedOffset];

答案 2 :(得分:0)

如果这是实际的代码并且假设theTableView不是nil,那么你应该收到一条警告,说“可能没有响应......”因为scrollToRowAtIndexPath拼写错误。

其次,atScrollPosition参数需要UITableViewScrollPosition枚举值,指示您希望目标行位于屏幕上的位置。

试试这个:

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