当tabBarItem点击事件戏很多

如果有这样一个需求
点击tabBar的一个item,如果点击的是该item对应的页面就让头部滚动栏index值为0,如果当前页面不是点击item对应的,不做处理,正常情况即可。

废话不多说,上干货...

思路:

1.获取tabBar点击触发的代理方法
2.记录上一次点击tabBar的item
3.判断是否前后点击了相同的tabBar的item

解决:

1.创建一个继承自UITabBarController的子类

2.添加两个属性,上次点击的item,是否点击了相同的item


#import 

@interface YWRootTabBarController : UITabBarController

/**
 记录上次的item
 */
@property (nonatomic,strong) UITabBarItem *lastItem;

/**
 是否和上次点击的相同,初始化为YES
 */
@property (nonatomic,assign) BOOL isEqualLastItem;

@end

3.遵循 协议,将自己设置为自己的代理

//工程中我写在了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 的时候遵循 协议,实现代理方法

- (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
{
    //进行你的操作就好
}

你可能感兴趣的:(当tabBarItem点击事件戏很多)