Storyboard - 不使用 UINavigationController 弹出根 UIViewController?

4
我有一个UIViewController层次结构,其中包含一个根视图控制器,它连接到一个UITabBarController,该控制器下面有几个UIViewControllers。每个选项卡的UIViewController都有自己的UINavigationController。没有共享的UINavigationController,也没有适用于根视图控制器的UINavigationController。现在我遇到了这样一种情况:我需要从其中一个选项卡的UIViewControllers弹出到根视图控制器。然而,由于根视图控制器和选项卡的UIViewControllers没有共同的UINavigationController,所以我无法简单地调用[self.navigationController popToRootViewControllerAnimated:YES]。是否可以在没有共享的UINavigationController的情况下弹出到根视图控制器(或编程方式取消我的Segue)?

"你所谓的“Root View Controller”是导航控制器吗?还是作为其根视图控制器包含在其中?选项卡视图控制器是被推送还是呈现?" - danh
不,根视图控制器不是UINavigationController。它是一个标准的UIViewController。 - Shadowman
2个回答

1

我曾经遇到过类似的问题,试试这个

UIStoryboard *storyBrd = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = nil;
controller = [storyBrd instantiateInitialViewController];
self.view.window.rootViewController = controller;

这个初始视图控制器是您的根视图控制器。否则,您也可以使用该方法。
[storyBrd instantiateViewControllerWithIdentifier:<View Controller's Restoration ID>]

0

这是我对VC安排的理解:

                             |-navvc
                             |   |--rootvc-(pushes)-stack...
"root" vc-(presents)->tabvc--|    
                             |-navvc
                                 |--rootvc-(pushes)-stack...

只要您持有正确的句柄,解开所有这些都很容易。选项卡中的导航VCS可以由它们堆栈上的任何视图控制器使用self.navigationController访问。

您还需要掌握选项卡栏VC或您称之为“根”VC。您可以通过应用程序委托上的属性来安排它。

唯一需要记住的其他棘手问题是从“根”VC到选项卡栏的转换是一个present而不是push,因此必须使用dismiss而不是pop来撤消它。为了在代码中表达这一点,假设您在应用程序委托上有一个对选项卡栏VC的句柄....

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UITabBarController *tabBarVC;

- (void)popEverything:(BOOL)animated;

@end

// AppDelegate.m

// get the tab bars tabs (which are presumed to be navigation vcs)
// dismiss the tab bar vc (which was presumed to be presented)
// iterate the navigation vcs, popping all of them to root
- (void)popEverything:(BOOL)animated {
    NSArray *viewControllers = self.tabBarVC.viewControllers;
    [self.tabBarVC dismissViewControllerAnimated:animated completion:^{
        for (UINavigationController *navVC in viewControllers) {
            [navVC popToRootViewControllerAnimated:animated];
        }
    }];
}

注意事项:仍对您的vc安排有些猜测,并且尚未测试上述内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接