当用户已经登录另一个选项卡时选择选项卡栏时导航另一个屏幕-iOS
Navigating another screen when tabbar selected when user already logged in another tab-iOS
我的应用有四个显示不同信息的选项卡。
在我的第二个选项卡视图控制器中,我有一个按钮可以将其命名为 button1
在我导航到 SignInViewController
屏幕的 button1
操作中,在我的第三个选项卡视图控制器中是loginViewController
.
此处 SignInViewController
和 loginViewController
屏幕的用途相同,即用户可以在两个 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 将 Segue 从 loginViewController
推送到 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];
通过情节提要,您可以像这样嵌入导航控制器
希望这会有所帮助。
我的应用有四个显示不同信息的选项卡。
在我的第二个选项卡视图控制器中,我有一个按钮可以将其命名为 button1
在我导航到 SignInViewController
屏幕的 button1
操作中,在我的第三个选项卡视图控制器中是loginViewController
.
此处 SignInViewController
和 loginViewController
屏幕的用途相同,即用户可以在两个 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 将 Segue 从 loginViewController
推送到 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];
通过情节提要,您可以像这样嵌入导航控制器
希望这会有所帮助。