我有一个标签栏项目,它连接导航控制器和 UIViewController 作为根视图控制器。第一次触摸选项卡栏项目会切换到该视图。第二次触摸弹出到根视图控制器。第三次触摸不会滚动到顶部。
我在其他应用程序中看到过这种滚动到顶部的行为,但是在搜索网络后,我找不到任何关于它的信息。
这是附加到标签栏项目的滚动视图或表格视图的默认行为,还是我需要自己实现?
我有一个标签栏项目,它连接导航控制器和 UIViewController 作为根视图控制器。第一次触摸选项卡栏项目会切换到该视图。第二次触摸弹出到根视图控制器。第三次触摸不会滚动到顶部。
我在其他应用程序中看到过这种滚动到顶部的行为,但是在搜索网络后,我找不到任何关于它的信息。
这是附加到标签栏项目的滚动视图或表格视图的默认行为,还是我需要自己实现?
我意识到这是一个较老的问题,但我也在寻求创建这种行为,我认为我有一个更简单的解决方案。
首先,将您的 AppDelegate 设置为您的UITabBarController
. 然后将此方法添加到AppDelegate.m:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
if ([tabBarController.viewControllers objectAtIndex:tabBarController.selectedIndex]==viewController)
{
if ([viewController isKindOfClass:[UITableViewController class]])
{
[[(UITableViewController *)viewController tableView] setContentOffset:CGPointZero animated:YES];
}
else if ([viewController isKindOfClass:[UINavigationController class]])
{
UINavigationController *nav = (UINavigationController *)viewController;
if ([nav.visibleViewController isKindOfClass:[UITableViewController class]])
[[(UITableViewController *)nav.visibleViewController tableView] setContentOffset:CGPointZero animated:YES];
}
}
return YES;
}
如果您的选项卡指向 aUITableViewController
或以UINavigationController
aUITableViewController
作为根视图,则此方法有效,并且您不必担心区分哪些UITableViewController
受到影响、发送通知等。
这是单击标签栏时滚动到表格视图顶部的解决方案
在 AppDelegate 中设置标签栏委托
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
if (tabBarController.selectedIndex == 0) {
UINavigationController *selectedNav = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex];
UIViewController *currentVC = selectedNav.visibleViewController;
if([currentVC isMemberOfClass:NSClassFromString(@"HomeViewController")])
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil];
}
}
return YES;
}
在 HomeViewController.m 视图中确实加载了监听通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(refreshView:)
name:@"refreshView"
object:nil];
刷新方法
-(void)refreshView:(NSNotification *) notification{
if (self == self.navigationController.topViewController)
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}
不,这不是默认行为,您必须自己实现。
我会通过让应用程序委托标签栏控制器的委托来做到这一点,并实现 -tabBarController:didSelectViewController: 来发布通知。在您的表格视图控制器中收听该通知并执行以下操作:
if (self == self.navigationController.topViewController)
[self.tableView scrollToTop];
由于您的选项卡控制器只能有一个委托,因此您可能需要查看这个问题的答案,它描述了如何使用 KVO 监听点击。