ObjC选择TabBarItem时如何弹回RootViewController

问题描述 投票:0回答:3

我得到了以下流程

在Home Tab选择Evening称为[self.parentViewController.tabBarController setSelectedIndex:2];转到Class Tab

At Home Select Evening

在Class Tab中选择任何Class

At Class select a class

转到下一个VC

Next VC

再次选择Home Again和Evening

Select Home and select Evening Again

留在以前的VC没有回到根视图qazxsw poi

应该在这里Remain At the next VC

ShouldBe RootViewController我执行Home Tab[self.parentViewController.tabBarController setSelectedIndex:2];。然后从嵌入Class Tab的Class Tab中,我将使用NavigationController进入下一个VC及以后。

但当我再次选择seague时,我希望Home Tab回到Class Tab

我尝试过以下但是没有用。每当下一个RootViewController消失时,它将继续弹出RootViewController

VC

我有以下代码MyTabBarController,它是由一个堆栈溢出大师给我的,但不知道在哪里调整到每次选择新的 -(void) viewWillDisappear:(BOOL)animated { [self.navigationController popViewControllerAnimated:YES]; [super viewWillDisappear:animated]; } 时返回到RootViewController Class.m选项卡。请帮忙。

TabBarController

添加了以下代码,它会触发,但不会将selectedIndex = 2带回Root

 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    NSLog(@"didSelectViewController... ");

//==== Tried this but not triggering =====    
//[(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
//if ([viewController isKindOfClass:[UINavigationController class]]) {
    //[self.navigationController popViewControllerAnimated:YES];
//}
//==========================================

    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);

    if ([viewController isKindOfClass:[UINavigationController class]]) {

        // we're expecting a nav controller so cast it to a nav here
        UINavigationController *navController = (UINavigationController *)viewController;

        // now grab the first view controller from that nav controller
        UIViewController *firstViewControllerInNav = navController.viewControllers.firstObject;

        // check to make sure it's what we're expecting (ParentViewController)

       if ([firstViewControllerInNav isKindOfClass:[ParentViewController class]]) {
            // cast it to our parent view controller class
            [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
            ParentViewController *viewControllerToCallMethodOnAfterSelection = (ParentViewController *)firstViewControllerInNav;
            [viewControllerToCallMethodOnAfterSelection doStuffWhenTabBarControllerSelects];
        }else{
        //=== The following code will make viewWillAppear load on each tab bar item
        //=== Without it, tapping on new tab bar item will not load viewWillAppear
            [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
        }
    }


}

添加了StoryBoard

-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { NSUInteger shouldSelectIndex = [tabBarController.viewControllers indexOfObject:viewController]; //Check if current index is Class tab and new index is Home if (tabBarController.selectedIndex == 2 && shouldSelectIndex == 0) { [self.navigationController popViewControllerAnimated:YES]; //[(UINavigationController *)viewController popToRootViewControllerAnimated:NO]; //[tabBarController.viewControllers objectAtIndex:tabBarController.selectedIndex]; } return YES; }

添加了文件结构

Story Board

ios objective-c uinavigationcontroller uitabbarcontroller
3个回答
0
投票

在tabbarController中创建一个方法,并在希望类选项卡到达其根视图控制器时调用此方法

File Structure

在您的情况下,我认为您希望在单击其他选项卡时重置视图控制器,以便您可以使用tabbar委托方法检查是否单击其他标签栏项并调用该方法

-(void)popToClassRootViewController{
    // Considering the fact that class view contorller will always be on 3 no and will be of UINavigationController
    UINavigationController *classNavController = (UINavigationController *)[self.viewControllers objectAtIndex:2];
    // You can get the navigation controller reference by any way you prefer
    [classNavController popToRootViewControllerAnimated:false];
}

0
投票

如果我理解正确,那么如果当前选项卡是- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { NSUInteger index = [tabBarController.viewControllers indexOfObject:viewController]; if (index != 2) { //Note: Call this method according to your need in this case it will be called whenever user will select tab other then Class [self popToClassRootViewController]; } return true; } 并且Class选项卡被选中,则您想要返回到根视图。也许这比使用Home更好:

didSelectViewController

0
投票

使用下面的快速代码清除导航栏控制器阵列

guard let child = self.childNavController else {return}

child.viewControllers = []

您可以在tabbar didselect方法中使用相同的目标C.

© www.soinside.com 2019 - 2024. All rights reserved.