当用户已经登录另一个选项卡时选择选项卡栏时导航另一个屏幕-iOS

Navigating another screen when tabbar selected when user already logged in another tab-iOS

我的应用有四个显示不同信息的选项卡。

在我的第二个选项卡视图控制器中,我有一个按钮可以将其命名为 button1 在我导航到 SignInViewController 屏幕的 button1 操作中,在我的第三个选项卡视图控制器中是loginViewController.

此处 SignInViewControllerloginViewController 屏幕的用途相同,即用户可以在两个 ViewController 中登录应用程序。

我真正想要的是,如果我登录 SignInViewController 然后每当我点击第三个 TabBarItem View Controller 应该直接导航到 loginViewController 的下一个屏幕即我将下一个屏幕命名为 AccountViewController。我在 tabbarcontroller class 中尝试了以下代码,但它不起作用。

请帮我解决这个问题。 提前致谢。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{

       if (tabBarController.selectedIndex == 2){

        {

          if (![[[NSUserDefaults standardUserDefaults]objectForKey:@"SigninStatus"] isEqualToString:@"SigninSuccess"]){

                UIStoryboard *story =  [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                LoginViewController *logInVc = [story instantiateViewControllerWithIdentifier:@"LoginViewController"];
                [self.navigationController pushViewController:logInVc animated:YES];
            }
            else
            {

                UIStoryboard *story =  [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                AccountViewController *accountVc = [story instantiateViewControllerWithIdentifier:@"AccountViewController"];
                [self.navigationController pushViewController:accountVc animated:YES];

            }
        }
    }  
}

1.Is 你的 loginViewController 嵌入在 UINavigationController?

-如果不是,则将其嵌入 UINavigationController

2.Create a 将 SegueloginViewController 推送到 AccountViewController 例如segue 标识符:segueLoginToAccount

3.Now 当用户单击第 3 个选项卡栏项目时,在 loginViewController 上创建一个检查 viewDidLoad,以查看用户是否已经登录:

-(void)viewDidLoad {
    [super viewDidLoad];

    if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"SigninStatus"] isEqualToString:@"SigninSuccess"]) {
        //already logged in, push to Account View
        [self performSegueWithIdentifier:@"segueLoginToAccount" sender:nil];
    }//else user will stay on Login View
}

无需使用tabBarController didSelectViewController:方法。

首先 - 如果两个 viewcontroller 的目的相同,那么为什么两个按钮的视图控制器不同?对于这两种情况,您都应该使用 same viewcontroller

第二件事,你可以在 NSUserDefaults 中存储一些 flag or status,其中包含有关用户是否登录的信息。

然后只需将 if - else 条件放在按钮单击上,如果用户已登录,则 instantiate 下一个视图控制器而不是 loginVC,或者如果用户未登录,则显示 loginVC 就是这样。

更新:

正如您在评论中询问的那样,您希望在点击标签栏时执行此操作,那么您应该 subclass - UITabBarController and set it to your UITabBarController in iterface builder 并且在那个 class 中您需要实现委托方法 - didSelectItem 并在此方法中检查从 userdefaults 用户是否登录并相应地设置视图控制器!

参考了解更多详情!

您需要将第三个视图控制器放在 NavigationController 中。这将为控制器启用导航堆栈。

UIViewController* loginviewcontroller = [UIViewController alloc] init];

UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController: loginviewcontroller];

在 Tabbar 中分配这个 navController。

例如:

NSMutableArray* viewControllersList = [[NSMutableArray alloc] init];

[viewControllersList addObject: navController];

[tabBarController setTabBarControllers: viewControllersList];

通过情节提要,您可以像这样嵌入导航控制器

希望这会有所帮助。