iOS 点击TabbarItem是否跳转登陆界面

在有些项目里面点击TabbarItem需要判断用户是否登陆,如果登陆则进入,未登录就跳转登陆界面.如果在点击的TabbarItem所属控制器中添加判断方法,该界面也有正常的短暂加载之后才进入登陆界面,这样的效果是大家都不想看到的,解决方法如下:

1.创建 TabbarViewController : UITabBarController, 在里面写入项目所需的TabbarItem. 例如: 首页,喜欢,消息,收益,我 共五个. 后三个需要登陆才可进入.
2.在 AppDelegate.m

@interface AppDelegate ()
@property (nonatomic, strong) TabbarViewController *tabbarVC;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /************** 1.创建window **************/
    self.window = [[UIWindow alloc] init];
    self.window.frame = [UIScreen mainScreen].bounds;
    /************** 2.设置根控制器 **************/
    // 创建tabBarVc
    _tabbarVC = [[TabbarViewController alloc] init];
    _tabbarVC.delegate = self;
    // 设置窗口的根控制器
    self.window.rootViewController = _tabbarVC;
    /************** 3.显示窗口 **************/
    [self.window makeKeyAndVisible];
    return YES;
}

/**
 *  TabBarController代理
 */
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    if ([viewController.tabBarItem.title isEqualToString:@"消息"] || [viewController.tabBarItem.title isEqualToString:@"收益"] || [viewController.tabBarItem.title isEqualToString:@"我"]) {
        NSString *sign = ;     //取出登陆状态(NSUserDefaults即可) 
         NSInteger selectedIndex;
        if (sign == nil) {  //未登录
            if ([viewController.tabBarItem.title isEqualToString:@"消息"]) {
                selectedIndex = 2;
            } else if ([viewController.tabBarItem.title isEqualToString:@"收益"]) {
                selectedIndex = 3;
            } else if ([viewController.tabBarItem.title isEqualToString:@"我"]) {
                selectedIndex = 4;
            }
            LoginViewController *loginVC = [[LoginViewController alloc]init]; //登陆界面
            loginVC.selectedIndex = selectedIndex;    //将所选的TabbarItem 传入登陆界面
            loginVC.hidesBottomBarWhenPushed = YES;   //隐藏Tabbar
            NavigationController *loginNav = [[NavigationController alloc] initWithRootViewController:loginVC];   //使登陆界面的Navigationbar可以显示出来
            [((UINavigationController *)tabBarController.selectedViewController) presentViewController:loginNav animated:YES completion:nil]; //跳转登陆界面

           //在登陆界面判断登陆成功之后发送通知,将所选的TabbarItem传回,使用通知传值
            [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(logSelect:) name:@"logSelect" object:nil];     //接收

            return NO;
        }else{
            return YES;
        }
    }else{
        return YES;
    }
}

- (void)logSelect:(NSNotification *)text{
    _tabbarVC.selectedIndex = [text.userInfo[@"logSelect"] integerValue];
}

@end
到这里,本文的要求基本已经实现.具体到登录界面的跳转或返回就看项目逻辑了.

问题1. 在有引导页的情况下,如果判断是第一次进入并将引导页设置为根控制器之后再跳转tabbarVC,那么本次启动的登陆判断(tabBarController代理)是无效的,需再次启动才有效.
我的方法是在AppDelegate中,直接将窗口的根控制器设置为tabbarVC,在TabbarViewController.m 判断是否为第一次进入,如果是第一次则将引导页添加到主window上,之后再移除.

问题2. 在喜欢界面(第二个界面)点击 TabbarItem 中的消息(第三个界面,需判断登陆),进入登陆界面,登陆成功之后还是停留在第二个界面.
使用_tabbarVC.selectedIndex方法可以在登陆成功之后停留在第三个界面(即所点界面).

如有哪些不对的地方,请大家指出,非常感谢.

3月30日 修改
针对问题1 解决方法: 将 TabBarController的代理写到 TabbarViewController 控制器中,判断版本号和设置根控制器写到AppDelegate中 即可解决.

你可能感兴趣的:(iOS 点击TabbarItem是否跳转登陆界面)