标签栏项目第三次触摸表格视图不滚动到顶部

时间:2012-05-31 17:52:58

标签: objective-c ios uitableview uiscrollview uitabbarcontroller

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

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

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

4 个答案:

答案 0 :(得分: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;
}

如果您的标签指向UITableViewControllerUINavigationControllerUITableViewController作为根视图,则此方法有效,您无需担心区分哪个{{ 1}}受影响,发送通知等

答案 1 :(得分:2)

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

在AppDelegate中设置tabbar委托

- (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];
    }

答案 2 :(得分:1)

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

我通过让应用程序委托标签栏控制器的委托来实现它,并实现-tabBarController:didSelectViewController:发布通知。在表视图控制器中侦听该通知,并执行以下操作:

if (self == self.navigationController.topViewController)
    [self.tableView scrollToTop];

答案 3 :(得分:0)

由于您的标签控制器只能有一个委托,您可能需要查看this question的答案,其中介绍了如何使用KVO监听点击。

相关问题