问题:今天在项目中遇到这样一个需求,tabBar上有首页,商家,购物车,个人中心四个模块,当点击商家和购物车时要判断用户是否已经登录,如果没有就要跳转到登录界面,登录成功后回到指定的控制器,就拿购物车来说,登录成功后自动跳到购物车界面去
思路:在AppDelegate里面设置tabBarController的代理为self,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中添加监听事件,登录成功发送通知,通知信息里面传递tabBar的selectIndex值,至于如何传递这个值有很多方法。然后实现- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
方法,跳转到登录控制器,登录完成自动跳回
以下是AppDelegate核心代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(logSelect:) name:LoginSuccessNotification object:nil];//接收成功的通知
}
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
//这里我判断的是当前点击的tabBarItem的标题
if ([viewController.tabBarItem.title isEqualToString:@"购物车"])
{
//我的登录状态存放在本地
if ([[[NSUserDefaults standardUserDefaults] objectForKey:LoginStatu] isEqualToString:successLogin]) {
return YES;
}
else//未登录
{
//跳到登录页面,这里我是用单利来存储tabbar的selectIndex的,个人习惯
LoginViewController *login = [[LoginViewController alloc] init];
[MKJRequestHelper shareRequestHelper].selectIndex = @"2";
login.hidesBottomBarWhenPushed = YES;
[((UINavigationController *)tabBarController.selectedViewController) pushViewController:login animated:YES];
return NO;
}
}
//如果是商家
else if([viewController.tabBarItem.title isEqualToString:@"商家"])
{
if ([[[NSUserDefaults standardUserDefaults] objectForKey:LoginStatu] isEqualToString:successLogin])
{
return YES;
}
else
{
//跳到登录页面
LoginViewController *login = [[LoginViewController alloc] init];
[MKJRequestHelper shareRequestHelper].selectIndex = @"1";
login.hidesBottomBarWhenPushed = YES;
[((UINavigationController *)tabBarController.selectedViewController) pushViewController:login animated:YES];
return NO;
}
}
return YES;
}
//登录成功接受到的方法,让tabBarConroller直接跳转到你想跳的界面中去
- (void)logSelect:(NSNotification *)text{
_tabBarVC.selectedIndex = [text.userInfo[@"index"]integerValue];
}
登录控制器的代码就只有发送通知就可以了,