Iphone TTTableViewController ScrollStop不工作

Iphone TTTableViewController ScrollStop不工作,iphone,ios,uitableview,three20,Iphone,Ios,Uitableview,Three20,我使用的是一个基本的TTTableViewController子类,它使用自己的数据源和模型。 问题是我似乎无法使用表的ScrollStop属性。这是表的标准属性,继承自UIScrollView,非常常用 我在课堂上的许多不同地点/方法中尝试了以下所有方法: self.tableView.scrollsToTop = YES; [self.tableView setScrollsToTop:YES] 我还尝试重写该方法 一切都没有成功 NB。为了清楚起见,我指的是在状态栏上轻触以将可见表

我使用的是一个基本的
TTTableViewController
子类,它使用自己的数据源和模型。

问题是我似乎无法使用表的ScrollStop属性。这是表的标准属性,继承自UIScrollView,非常常用

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

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

我还尝试重写该方法

一切都没有成功

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

非常感谢任何帮助

试试这个:


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

还要检查您的代理在此方法中是否返回“是”:

scrollViewWillScrollToTop:

有些混乱 根据:

卷轴炉顶 一个布尔值,用于控制“滚动到顶部”手势是否有效

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

您需要的是: ScrollToRowatineXpath:atScrollPosition:animated: 滚动接收器,直到索引路径标识的行位于屏幕上的特定位置

使用
three20
由于您使用的是
three20
,由于其
UITableView+附加功能,您想做的事情可以轻松完成。h
-(void)scrollToFirstRow:(BOOL)动画

[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
中提取)也可以(未经测试):

或:


正如@imnk所建议的,我的想法是一个答案,尽管我没有真正的解决办法

我所经历的(只是确认一下)是,一旦我更改了tableView的frame属性,状态栏上的触摸就不再起作用了

根据,每个scrollView的委托(无论大小)都可以在
-(BOOL)scrollView shouldScrollToTop:(UIScrollView*)scrollView
上返回YES

但我浏览了三个20,并在我对代表的默示中更改了它,但没有成功。


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

我发现在以下条件下,添加了两个TableView作为视图控制器视图的子视图:

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

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

  • 正如Vincent指出的那样,由于存在两个UIScrollView,scroll to top操作无法正常工作。我将把这些发现作为一个bug提交给三个20人,但按照这些步骤至少可以暂时避免


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

    谢谢你的回复。不幸的是,上述措施都没有奏效。奇怪的是,在整个应用程序的某些表格中观察到了正常的行为,但在其他表格中却没有观察到。表中任何地方都没有嵌入滚动视图。幸运吗?我刚刚在一个项目中发现了这一点。表视图似乎正确设置了它的委托和ScrollStop,但它不工作。请检查下面我的答案。现在把它整理好了。我只是把我的代码移动了一点。我已经编辑了我的原始问题,以便更清楚地了解到底是什么问题。我在这里关注的是通过状态栏点击手势滚动到顶部。不以编程方式滚动表格。啊,好的。好。我在许多项目中大量使用了
    three20
    ,但从未遇到过这个问题。只需尝试
    TTCatalog
    示例应用程序,您将看到。。。甚至不需要设置此变量,因为它是默认值。那么恐怕这与你的代码有关,没有它,没有人能帮上忙。或者那可能是一个320错误(我怀疑),从那以后就被修复了。我认为当你向tableview添加一些固定的子视图和/或调整tableview的大小时会发生这种情况。。。至少,这是我正在经历的。但到目前为止还没有找到解决方案。到目前为止@denbec您提供了对这个问题的最佳见解。将您的评论作为答案发布可能是一个好主意,因为它确实可以很好地说明这个问题。您可以转储视图树吗?视图控制器和
    gdb
    run
    po[[self view]recursiveDescription]
    中的断点查看我的答案。如果在viewDidLoad中更改此属性,则可能会遇到双表视图问题。
    viewDidLoad
    在您调用
    self.view
    时都会被调用,我打赌您在init调用中会这样做。您应该避免在初始化时生成视图。保持
    init
    用于简单初始化(如检索参数、模型数据等),并使用
    loadView
    用于任何与视图相关的内容。请记住,可以在内存不足时卸载视图,然后在下次出现时自动重新加载(
    loadView
    )。这就是为什么
    init
    loadView
    明显分开的原因。。。而不是一个three20 bug,一个对内存使用有意义的iOS设计选择。。。看看iOS的内存管理。谢谢你的回答,几个月来它一直困扰着我!仅移动self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;从init到viewDidLoad修复了问题
    - (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];
      }
    }
    
    - (void)scrollToTop:(BOOL)animated {
      [self setContentOffset:CGPointMake(0,0) animated:animated];
    }
    
    [self.tableView setContentOffset:CGPointMake(0,0) animated:YES];