TTTableViewController scrollsToTop 不工作

Posted

技术标签:

【中文标题】TTTableViewController scrollsToTop 不工作【英文标题】:TTTableViewController scrollsToTop not working 【发布时间】:2010-09-21 11:41:44 【问题描述】:

我正在使用一个基本的 Three20 TTTableViewController 子类,它使用自己的数据源和模型。 问题是我似乎无法使用表格的 scrollsToTop 属性。这是表格的标准属性,继承自 UIScrollView,非常常用。

我已经在课堂上的许多不同地点/方法中尝试了以下所有方法:

self.tableView.scrollsToTop = YES;
[self.tableView setScrollsToTop:YES]

我也尝试过覆盖该方法

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView 
    return YES; 

都没有成功。

注意。为了清楚起见,我指的是点击状态栏以将可见的表格视图滚动到顶部(即第一行)的标准手势。

非常感谢任何帮助!

【问题讨论】:

运气好了吗?我刚刚在我正在进行的一个项目中发现了这一点。表格视图似乎正确设置了它的委托和 scrollsToTop,但它不起作用。 在 Ryan 下面查看我的答案。现在整理好了。只需要稍微移动一下我的代码。 【参考方案1】:

有些混乱

根据Apple documentation of UIScrollView:

scrollsToTop

控制滚动到顶部手势是否有效的布尔值

这只是告诉scrollview点击状态栏会使视图滚动到顶部。

你要找的是this UITableView method:

scrollToRowAtIndexPath:atScrollPosition:animated:

滚动接收器,直到由索引路径标识的行位于屏幕上的特定位置。

three20

由于您使用three20,您想做的事情可以很容易地完成,这要归功于它的UITableView+Additions.h > - (void)scrollToFirstRow:(BOOL)animated

[self.tableView scrollToFirstRow:YES];

没有three20

如果不使用three20,下面是three20 的做法:

- (void)scrollToFirstRow:(BOOL)animated 
  if ([self numberOfSections] > 0 && [self numberOfRowsInSection:0] > 0) 
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop
          animated:NO];
  

另一种方法

我认为直接使用 UIScrollView 也可以(未经测试)(也从three20 中提取):

- (void)scrollToTop:(BOOL)animated 
  [self setContentOffset:CGPointMake(0,0) animated:animated];

或:

[self.tableView setContentOffset:CGPointMake(0,0) animated:YES];

【讨论】:

我已经编辑了我的原始问题,以便更清楚地了解问题到底是什么。我在这里关心的是通过状态栏点击手势滚动到顶部。没有以编程方式滚动表格。 嗯,好的。好。我在许多项目中大量使用three20,但从未遇到过这个问题。只需尝试TTCatalog 示例应用程序,您将看到...甚至不需要设置此变量,因为它是默认值。那这恐怕和你的代码有关,没有它,谁也帮不上忙。或者也许那是一个已经修复的three20错误(我怀疑)。 我认为当您将一些固定子视图添加到 tableview 和/或调整 tableview 大小时会发生这种情况......至少,这就是我正在经历的。但目前没有找到解决方案。 到目前为止,@denbec 您已经提供了对此问题的最佳见解。发布您的评论作为答案可能是个好主意,因为它确实可以很好地说明这个问题。 你能转储你的视图树吗?在你的视图控制器和gdb 中运行断点po [[self view] recursiveDescription]【参考方案2】:

感谢 Vincent G 为我指明了正确的方向。看来问题与类的 init 和 viewDidLoad 方法中调用的代码有关。

我发现在以下情况下,添加了两个tableview作为视图控制器视图的子视图:

    在 viewDidLoad 方法中引用属性 tableView,例如[[self tableView] setTableHeaderView:]

    在 init / initWithStyle 方法中构建表的数据源。

正如文森特指出的那样,在存在两个 UIScrollView 的情况下,滚动到顶部操作无法正常工作。我将把这些发现作为一个 bug 提交给 Three20 人,但通过遵循这些步骤,至少现在可以避免它。

编辑:似乎这可能是由于在某些情况下在 init 之前调用了 viewDidLoad 方法。如果在 viewDidLoad 中引用了 tableview,在它被创建之前,我认为这个类正在创建一个。然后 init 将创建另一个。

【讨论】:

viewDidLoad 会在您调用 self.view 时被调用,我敢打赌您在 init 调用中会这样做。您应避免在初始化时构建视图。保留init 用于简单的初始化,(如检索参数、模型数据......)并使用loadView 进行任何与视图相关的操作。 请记住,您的视图可以在内存不足时卸载,然后在下一次出现时自动重新加载 (=loadView)。这就是为什么initloadView 明显分开的原因......而不是一个three20 错误,一个对内存使用有意义的ios 设计选择......看看iOS 的内存管理。 感谢您的回答,这几个月来一直困扰着我!只是移动 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;从初始化到 viewDidLoad 为我解决了这个问题。再次感谢非常感谢。【参考方案3】:

试试这个:

self.tableview.scrollingEnabled=YES; self.tableview.scrollsToTop=YES;

还要检查您的委托是否在此方法中返回 YES:

scrollViewWillScrollToTop:

【讨论】:

感谢您的回复。不幸的是,以上都没有奏效。奇怪的是,在整个应用程序中的某些表格中观察到了正常行为,但在其他表格中却没有。任何地方的表格中都没有嵌入滚动视图。【参考方案4】:

正如@imnk 建议的那样,我的想法作为答案,即使我没有真正的解决方案。

我正在经历的(并且刚刚验证过)是,一旦我更改了 tableView 的 frame 属性,statusBar 上的触摸就不再起作用了......

根据Apples documentation on UIScrollViewDelegate,每个scrollView 的委托(无论其大小)都可以在- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView 上返回YES。

但我查看了three20并在代表的实现中对其进行了更改,但没有成功。

【讨论】:

看看我的回答。如果您在 viewDidLoad 中更改此属性,那么您可能会遇到双表视图问题。

以上是关于TTTableViewController scrollsToTop 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Felix/OSGi:如何使用不是 OSGi 服务的 SCR 组件?

安卓手机屏幕录像之scr

全志H3 uboot传参到内核分析,boot.scr文件分析

Felix Scr 更改日志级别

如何从 python 结果创建“.scr”或“.txt”输出文件

SCR(ServiceMix)没有拾取OSGI组件?