IOS 加载不同根的 UiNavigationController 和 TabController

IOS load different root of UiNavigationController of TabController

我认为对此有一个简单的答案,但我似乎找不到。我有一个带有标签栏的 IOS 应用程序。您登录并转到选项卡栏。对于其中一个选项卡按钮,我想根据条件显示不同的根视图。我创建了一个自定义 UiNavigationController 并设置了以下条件语句。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSString *can_post = @"yes" ;
    NSLog(@"can post: %@",can_post);


    if([can_post isEqualToString:@"yes"]) {
        // Display UserCanPostViewController
        NSLog(@"user can post");

    }
    else {
        // Display UserCanNotPostViewController
        NSLog(@"user can not post");
    }

}

问题是我似乎无法设置根视图。我能够找到的所有示例都展示了如何在 appdelegate 下设置根视图,这似乎会影响整个应用程序。我只想要这个有条件的申请单个选项卡按钮。

感谢您的帮助!

在 App Delegate 中...

设置您的标签栏以包含标签,这些标签是您正在谈论的特定标签的导航控制器...

...

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController1];

 [tabBarController setViewControllers:@[navigationController,
                                        viewController2,
                                        viewController3,
                                        viewController4]];

[self.window setRootViewController:tabBarController];

...

使 AppDelegate 成为 UITabBarControllerDelegate 并实现以下委托方法。

请注意,有更简洁的方法来执行此操作,但目前可以使用(这实际上不是 AppDelegate 的工作,但您可以稍后根据需要进行重构)

...

    tabBarController.delegate = self

...

在这个委托方法中....

- (void)tabBarController:(UITabBarController * nonnull)tabBarController
     didSelectViewController:(UIViewController * nonnull)viewController
{
    if (THIS IS NOT THE SPECIFIC TAB) return;

        UINavigationController *navigationController = (UINavigationController *)viewController;

    if([can_post isEqualToString:@"yes"]) {
        // Display UserCanPostViewController
        NSLog(@"user can post");

        [navigationController setViewControllers:@[UserCanPostViewController]];
    }
    else {
        // Display UserCanNotPostViewController
        NSLog(@"user can not post");

        [navigationController setViewControllers:@[UserCanNotPostViewController]];
    }

}