在有些项目里面点击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中 即可解决.
网友评论
点击登录按钮,不跳转页面是什么问题?