使用 UITableView 的奇怪滚动问题
Posted
技术标签:
【中文标题】使用 UITableView 的奇怪滚动问题【英文标题】:Weird Scrolling Issue Using UITableView 【发布时间】:2010-01-19 05:35:14 【问题描述】:我是一个正在工作的 UINavigationController 将两个不同的 UITableView 推入和推下堆栈。我的所有功能都正常工作,除了滚动。当任一表格滚动到顶行上方或底行下方时,它会停留在那里,暴露表格上方/下方的边距。我正在寻找能够“反弹”回来的表格,以便只有表格可见,而不是超出范围的空白区域 - 就像任何其他 iPhone 应用程序一样。
我的一个 UITableViews 正在由 NIB 加载,另一个正在以编程方式创建 - 两者的结果完全相同。我已经尝试了 Nib 中的所有弹跳和滚动设置,但似乎没有任何效果。
谁能告诉我我做错了什么?如果我可以更具体地详细说明我的问题,请告诉我。
谢谢,
-斯科特
我想添加更多信息,因为我仍然无法弄清楚这个问题。我应该指出,我尝试将此 NavigationController 添加到的应用程序不是主视图。我有一个使用 Nib 加载的 SettingsViewController。在该控制器中,我想创建一组基于导航的新视图。所以从我的 SettingsViewController 内部,如果用户点击一个按钮,我...
在我的按钮选择器中:
TextListViewController *controller = [[TextListViewController alloc] initWithStyle:UITableViewStylePlain];
controller.title = @"Test Table View";
navController = [[UINavigationController alloc] initWithRootViewController:controller];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[controller release];
上面的代码在除滚动之外的所有方面都能完美运行。我能够处理所有委托方法并将新控制器推送到堆栈上。我遇到的唯一问题是根控制器(以及所有其他推送的控制器)将无法正确滚动。
在任何情况下,它都允许我滚动过去表格的顶部和底部,并且不会像应有的那样快速返回。当您轻弹滚动时,它也没有随心所欲的感觉。相反,无论您滚动多快,只要您移开手指,它就会停止。很奇怪。
我尝试使用 Navigation 模板创建另一个项目 - 当然它工作正常 - 但模板假定 NavigationController 的视图一直附加 - 这不是我的情况。我在标准 ViewController 中即时创建所有这些。
感谢凯文的帮助,但我仍然在这里寻求帮助。
谢谢,
【问题讨论】:
【参考方案1】:好吧,我解决了这个问题,它与我如何将 UITableView 添加到 UINavigationController 或我如何实例化视图无关。事实证明它与任何一个都完全无关。
我正在使用紧凑的 while 循环来处理我的游戏循环。我需要一种方法来处理循环中的操作系统消息,以防止触摸和其他事件被阻止。这是我在循环中间使用的:
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);
直到出现这个滚动问题,我对这个实现完全没有任何问题。无论出于何种原因,这都会破坏 UITableView 的滚动功能。
我更改了我的游戏循环,因此不需要上面的代码,一切都开始工作了。
谢谢...
【讨论】:
在默认模式下运行自定义 NSRunLoop 时,我遇到了同样的情况。重构我的代码不需要修复问题,我的表格视图现在可以在模态显示的 UINavigationController 中正确滚动。谢谢! 您知道为什么这可能是一个问题吗?我遇到了同样的问题,但我认为我无法通过重构来解决。【参考方案2】:您的UITableView
是UIScrollView
,其属性bounces
是关键。这是reference。不过,默认情况下它是YES
。你检查过这个吗?
【讨论】:
是的,我检查过了,它设置为是。文档还说该属性,如果设置为 NO,将不允许视图滚动到内容的末尾。就我而言,它在两个方向上滚动过去。这可能与我的 UITableView 连接到 UINavigationController 的事实有关吗?谢谢... 我忘了说,滚动 20 多个项目的列表时,滚动不流畅。通常,当您快速向下移动手指并将其从屏幕上移开时,滚动会继续几行。就我而言,无论我滚动多快,在移开手指后滚动都会立即停止。有什么想法吗?【参考方案3】:您的问题和 cmets 似乎建议您以某种方式将 UITableView
附加到您的 UINavigationController
,而不是通过推送 UITableViewController
。如果你不这样做,你真的应该这样做。
一般来说,如果您可以将子视图控制器推送到UINavigationController
,那么您也可以单独使用子视图控制器来测试它。尝试将您的UITableViewController
视图设为窗口的根视图,看看是否符合您的预期。这样您就可以将问题隔离到表格视图部分或导航部分。
【讨论】:
Kevin,我正在创建一个 UINavigationController 并使用 Nav 的 initWithRootViewController 附加一个 UITableViewController。 TextListViewController *controller = [[TextListViewController alloc] initWithNibName:@"TextListViewController" bundle:nil]; controller.title = @"标题文本"; navController = [[UINavigationController alloc] initWithRootViewController:controller]; navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self sesentModalViewController:navController 动画:YES]; [控制器释放];它是否正确?感谢您的帮助。 哇,太丑了。不知道如何在这个论坛上以可读的格式向您展示代码。感谢您的任何帮助,您可以提供。 -斯科特 嗯。它看起来对我来说是正确的......尝试使用导航/表格视图模板与新项目进行比较。它应该基本上完成您想要完成的工作。【参考方案4】:我遇到了和你一样的问题,正如你上面所说的,这与你调用 runloop 的方式有关:
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);
似乎 DefaultMode 是错误的等待方式,我将代码更改为等待 UITrackingRunLoopMode 并且 TableView 工作正常。就我而言,我使用:
[[NSRunLoop currentRunLoop] runMode:UITrackingRunLoopMode beforeDate:[NSDate distantFuture]];
一切正常。
【讨论】:
以上是关于使用 UITableView 的奇怪滚动问题的主要内容,如果未能解决你的问题,请参考以下文章
未分配给父 UIViewController 视图属性时,UITableView 不滚动
UITableView - reloadRows 方法创建奇怪的滚动错误