美文网首页iOS开发之旅iOS开发(OC)程序员
iOS 点击TabbarItem是否跳转登陆界面

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

作者: TotoroLee | 来源:发表于2016-02-21 11:07 被阅读2853次

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

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

@interface AppDelegate ()<UITabBarControllerDelegate>
@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中 即可解决.

相关文章

网友评论

  • 有bug的程序猿:你好,通知移除在什么时候移除呢
  • 小双_f0ed:不对啊 TabbarViewController 不会走代理方法啊
    有bug的程序猿:不走代理方法,你怎么解决的
  • Hello_kid:在登录页面如果我不登录,点返回 会回到那个页面呢?,这个返回操作是在登录页面判断完成吗?
  • Hello_kid:代理方法我在继承的tabbar类里写是一样的效果吧;
  • 小羊孩子:_tabbarVC.selectedIndex = [text.userInfo[@"logSelect"] integerValue];
    点击登录按钮,不跳转页面是什么问题?
    小羊孩子:解决了
  • 许久__:能push而不是present进来吗?
  • okios:请问present到登录界面后,导航栏上的返回按钮不见了,怎么回事啊?
    TotoroLee:self.navigationController.navigationBarHidden 设置下这个属性
  • bb4cf902bdbc:大神, 小弟菜鸟一枚。想问一下 /取出登陆状态(NSUserDefaults即可) 这一步是怎么做的 NSUserDefaults 如何取出登录状态
    bb4cf902bdbc:@so灬寒冰 还有 登录成功后 账号的数据信息 怎么传到_tabbarVC界面呢
    bb4cf902bdbc:@TotoroLee 登录界面是单独 模态出来的 在登录成功后怎么样回去呢 我用这个方法 为什么会很卡很卡呢 [self dismissViewControllerAnimated:YES completion:nil];
    TotoroLee:如果登陆成功,使用NSUserDefaults存一个状态值为1,未登录的时候为0. 就是判断是否是登陆成功的状态.
  • 夜生物:大神,在哪里发送通知?可否有 demo?
    TotoroLee:@ChineseTiger 取消的界面是单独model出来的,和原来的tabbarController没有关联,self.tabBarController.selectedIndex = 1 不能放在取消的界面,你应该在点击取消的时候,让原来的界面所在tabbarController 的选中序列为1.
    夜生物:我遇到一个问题,登录界面有一个取消,点击取消的时候它会返回原来的界面,我在取消操作里面加了一句 self.tabBarController.selectedIndex = 1; 但是返回不了?能否加下你的QQ?
    TotoroLee:@ChineseTiger 大神不敢当,我还是个小菜鸟。 登录成功后发送通知,将点击tabbaritem的次序传递回去即可。
  • 真爱要有你才完美:还有 你的问题2 可以举个列子么
    TotoroLee:@真爱要有你才完美 在model出登录界面的时候已经将点击tabbaritem的次序传递过去了,只需要在登录成功的时候将这个次序以通知的方式传递回来就可以了。_tabbarVC.selectedIndex可指定tarbar界面的显示
  • 真爱要有你才完美:我登录后跳转到第二个结面了 这时候 有个按钮式退出登录 怎么实现
    TotoroLee:@真爱要有你才完美 还有问题的话,你可以简信发给我 :blush: :blush: :blush:
    真爱要有你才完美:能加下你的q 聊么
    TotoroLee:@真爱要有你才完美 你的意思是进入tabbar的二级界面中有个退出登录吗? 点击退出,让登录界面model出来,在登录界面写一个代理,当登录成功的时候将登录界面dismiss了,并调用代理。具体的代理方法在退出登录那个页面实现。 popToRootViewControllerAnimated 方法可以直接返回tabbar界面,self.tabBarController.selectedIndex 方法可以指定返回哪个界面。
  • StoneLeon:有小demo么? :smile:
    有bug的程序猿:你好通知移除在什么时候移除呢
    TotoroLee:@StoneLeon 这是写项目过程中的总结,还没有单独写Demo. 你对哪些地方有疑问可以提出来哈.

本文标题:iOS 点击TabbarItem是否跳转登陆界面

本文链接:https://www.haomeiwen.com/subject/moumkttx.html