2

我有一个标签栏项目,它连接导航控制器和 UIViewController 作为根视图控制器。第一次触摸选项卡栏项目会切换到该视图。第二次触摸弹出到根视图控制器。第三次触摸不会滚动到顶部。

我在其他应用程序中看到过这种滚动到顶部的行为,但是在搜索网络后,我找不到任何关于它的信息。

这是附加到标签栏项目的滚动视图或表格视图的默认行为,还是我需要自己实现?

4

4 回答 4

3

我意识到这是一个较老的问题,但我也在寻求创建这种行为,我认为我有一个更简单的解决方案。

首先,将您的 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或以UINavigationControlleraUITableViewController作为根视图,则此方法有效,并且您不必担心区分哪些UITableViewController受到影响、发送通知等。

于 2014-07-23T18:26:07.983 回答
2

这是单击标签栏时滚动到表格视图顶部的解决方案

在 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];
    }
于 2013-07-08T06:39:46.357 回答
1

不,这不是默认行为,您必须自己实现。

我会通过让应用程序委托标签栏控制器的委托来做到这一点,并实现 -tabBarController:didSelectViewController: 来发布通知。在您的表格视图控制器中收听该通知并执行以下操作:

if (self == self.navigationController.topViewController)
    [self.tableView scrollToTop];
于 2012-05-31T19:47:06.040 回答
0

由于您的选项卡控制器只能有一个委托,因此您可能需要查看这个问题的答案,它描述了如何使用 KVO 监听点击。

于 2013-07-08T06:45:14.033 回答