如果有这样一个需求
点击tabBar的一个item,如果点击的是该item对应的页面就让头部滚动栏index值为0,如果当前页面不是点击item对应的,不做处理,正常情况即可。
废话不多说,上干货...
思路:
1.获取tabBar点击触发的代理方法
2.记录上一次点击tabBar的item
3.判断是否前后点击了相同的tabBar的item
解决:
1.创建一个继承自UITabBarController的子类
2.添加两个属性,上次点击的item,是否点击了相同的item
#import <UIKit/UIKit.h>
@interface YWRootTabBarController : UITabBarController
/**
记录上次的item
*/
@property (nonatomic,strong) UITabBarItem *lastItem;
/**
是否和上次点击的相同,初始化为YES
*/
@property (nonatomic,assign) BOOL isEqualLastItem;
@end
3.遵循 <UITabBarControllerDelegate> 协议,将自己设置为自己的代理
//工程中我写在了viewDidLoad方法中
self.delegate = self;
4.初始化两个属性
(1)在 viewDidAppear 中初始化是因为要等 tabBar 创建完并显示出来,否则 self.tabBar.items 为空
(2)工程中进行判断的是首页的 item,工程一开始显示的也是首页,所以 isEqualLastItem 初始化为YES,所以初始化成你要操作那个item就好
(3)工程一进去显示的是首页,所以取出第一个元素对象进行初始化
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//初始化
self.isEqualLastItem = YES;
self.lastItem = [self.tabBar.items firstObject];
}
5.实现代理方法
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
// 判断本次点击的UITabBarItem是否和上次的一样
if (item == self.lastItem) {
// 一样就发出通知 将首页index置为0
self.isEqualLastItem = YES;
}else{
self.isEqualLastItem = NO;
}
// 将这次点击的UITabBarItem赋值给属性
self.lastItem = item;
}
6.在创建 tabBarController 的时候遵循 <UITabBarControllerDelegate> 协议,实现代理方法
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if (viewController == self.navMainController){
if (self.tabBarController.isEqualLastItem) {
//首页 点击首页按钮默认回到第一个index
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TABBARSELECT_SETMAININDEX object:nil userInfo:nil];
}
}
return true;
}
7.在需要执行方法的控制器中设置通知中心监听
//注册监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:NOTIFICATION_TABBARSELECT_SETMAININDEX object:nil];
-(void) doAction:(NSNotification *)noti
{
//进行你的操作就好
}