【问题标题】:Tab bar item third touch for a table view not scrolling to the top表格视图的标签栏项目第三次触摸不滚动到顶部
【发布时间】:2012-06-06 00:15:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c ios uitableview uiscrollview uitabbarcontroller


    【解决方案1】:

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

    首先,将您的 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;
    }
    

    如果您的选项卡指向 UITableViewControllerUINavigationController 并以 UITableViewController 作为根视图,则此方法有效,并且您不必担心区分哪个 UITableViewController 受到影响,发送通知等。

    【讨论】:

    • 我建议使用scrollToRowAtIndexPath:[NSIndexPath] indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];而不是setContentOffset
    【解决方案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];
        }
    

    【讨论】:

    • 给我一个错误:Property 'tabBarController' not found on object of type 'AppDelegate'
    【解决方案3】:

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

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

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

    【讨论】:

    • 如果标签栏项目触摸导致视图切换,我不想滚动到顶部。如何判断我是否正在切换视图?希望比-tabBarController:shouldSelectViewController: 更好。
    • 不,我认为在 -shouldSelect... 中测试当前选定的选项卡可能是你最好的选择:(
    • 好的,程序员必须做程序员必须做的事情。感谢您的帮助。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多