- (void)tabBarController:(UITabBarController *)barController didSelectViewController:(UIViewController *)viewController。来处理点击的过程。
其中一个模块涉及到了登陆的内容,Login这个类,但是登陆之后跳转到了accountCenter用户中心的类中,点击下面的tabbar就会又回到了Login这个类。因为tabBar加载的根类中,就有Login。因此是不能够改变的。这就需要在设计上,代码控制tabBar的加载。在Login成功后,还需要用Notification的方式发送通知,AppDelegate获得通知后,通过代码控制tabBar的再次加载。
下面粘贴出关键的代码:
新建Notification类,
#ifndef HnAir_NotificationForLogInAndOut_h
#define HnAir_NotificationForLogInAndOut_h
#define KLoginDoneNotification @"LogInDone_Notification"
#define KLogOutNotification @"LogOutDone_Notification"
#endif
在这里注册了两个通知,一个是登陆成功,另外一个是注销成功
在AppDelegate中,建立通知的两个监听方法:
[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(loginDoneNotification:) name:KLoginDoneNotification object:NULL];
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(logOutNotification:) name:KLogOutNotification object:NULL];
在获取到监听内容后,调用的方法:
-(void)loginDoneNotification:(NSNotification *)notification
{
logInAndOutCount =1;
NSArray *cons = [tabBarControllerviewControllers];
NSMutableArray *newControllers = [[NSMutableArrayalloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:account_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarControllersetViewControllers:newControllers];
tabBarController.selectedViewController = [tabBarController.viewControllersobjectAtIndex:3];
}
-(void)logOutNotification:(NSNotification *)notification
{
logInAndOutCount =0;
NSArray *cons = [tabBarControllerviewControllers];
NSMutableArray *newControllers = [[NSMutableArrayalloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:logIn_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarControllersetViewControllers:newControllers];
tabBarController.selectedViewController = [tabBarController.viewControllersobjectAtIndex:3];
}
当用户点击下面的tabbar的时候,代理方法中加入的代码:
int num = [tabBarController.viewControllersindexOfObject:viewController];
NSLog(@"num:%d",num);
if (logInAndOutCount ==0) {
if (num ==3) {
NSLog(@"用户没有登陆");
NSArray *cons = [tabBarControllerviewControllers];
NSMutableArray *newControllers = [[NSMutableArrayalloc]init];
[newControllers addObject:[cons objectAtIndex:0]];
[newControllers addObject:[cons objectAtIndex:1]];
[newControllers addObject:[cons objectAtIndex:2]];
[newControllers addObject:logIn_Controller];
[newControllers addObject:[cons objectAtIndex:4]];
[tabBarControllersetViewControllers:newControllers];
}
}
else {
if (num==3) {
NSLog(@"用户已经成功登陆");
NSArray *cons = [tabBarControllerviewControllers];
NSMutableArray *newControllers = [[NSMutableArrayalloc]init];
[newControllers addObject:[consobjectAtIndex:0]];
[newControllers addObject:[consobjectAtIndex:1]];
[newControllers addObject:[consobjectAtIndex:2]];
[newControllers addObject:account_Controller];
[newControllers addObject:[consobjectAtIndex:4]];
[tabBarController setViewControllers:newControllers];
}
}
以上代码主要的意义是:当点击下面的tabbar ,情况下,根据当前是否是登陆状态下,去切换tabar加载的根UINavigationController。
在Login类中,加入方法
-(void)postNotification
{
[[NSNotificationCenterdefaultCenter]postNotificationName:KLoginDoneNotification object:NULL];
}
当用户登陆成功后,调用[self postNotification];发送登陆信息,到监听方法进行捕获处理。同理,注销的方法也是一样的发送注销信息
这样就能够保证,下面的tabbar进行切换的过程中,不出现bug。由于项目设计到保密的内容,因此只能够技术性的介绍到这里。