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作为视图控制器视图的子视图:
编辑:在某些情况下,这可能是因为在init之前调用了viewDidLoad方法。如果在viewDidLoad中引用了tableview,则在创建它之前,我认为该类正在创建一个tableview。然后init将生成另一个 谢谢你的回复。不幸的是,上述措施都没有奏效。奇怪的是,在整个应用程序的某些表格中观察到了正常的行为,但在其他表格中却没有观察到。表中任何地方都没有嵌入滚动视图。幸运吗?我刚刚在一个项目中发现了这一点。表视图似乎正确设置了它的委托和ScrollStop,但它不工作。请检查下面我的答案。现在把它整理好了。我只是把我的代码移动了一点。我已经编辑了我的原始问题,以便更清楚地了解到底是什么问题。我在这里关注的是通过状态栏点击手势滚动到顶部。不以编程方式滚动表格。啊,好的。好。我在许多项目中大量使用了
three20
,但从未遇到过这个问题。只需尝试TTCatalog
示例应用程序,您将看到。。。甚至不需要设置此变量,因为它是默认值。那么恐怕这与你的代码有关,没有它,没有人能帮上忙。或者那可能是一个320错误(我怀疑),从那以后就被修复了。我认为当你向tableview添加一些固定的子视图和/或调整tableview的大小时会发生这种情况。。。至少,这是我正在经历的。但到目前为止还没有找到解决方案。到目前为止@denbec您提供了对这个问题的最佳见解。将您的评论作为答案发布可能是一个好主意,因为它确实可以很好地说明这个问题。您可以转储视图树吗?视图控制器和gdb
runpo[[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];