前言
今天,项目上遇到了一个需求,是类似于头条点击TabBar刷新当前页面的.做了一下午终于搞定, 在这里给大家说一下我的实现思路,顺带附上项目代码,供各位小伙伴参考
实现思路
- 自定义TabBar,遍历TabBar中的子控件,给TabBar添加点击事件
- 在点击事件中判断TabBar是不是重复点击
- 如果是的话,对外发出通知
- 在对应需要实现刷新的TabBar控制器中接收通知
- 添加事件,进行刷新操作
代码实现
首先,我们需要先在TabBarController.m中,将自定义的TabBar与系统TabBar进行替换
- (void)setTabBarButton
{
ZQTabBar *tabBar = [[ZQTabBar alloc]init];
[self setValue:tabBar forKey:@"tabBar"];
}
然后进入自定义TabBar中,遍历TabBar按钮,添加点击事件,判断是否与上次点击按钮的属性相等,如果相等的话就发出通知
interface ZQTabBar ()
/** 上次点按属性 */
@property (nonatomic ,weak)UIControl *previousClickTabBarButton;
@end
@implementation ZQTabBar
- (void)layoutSubviews
{
//初始化
[super layoutSubviews];
//遍历TabBar中的子控件
for (UIControl *tabBarBtn in self.subviews) {
//判断是否为TabBar按钮 ,不是就跳过
if (![tabBarBtn isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue;
//是否是第一次进入,如果是第一次进入,就将第一个按钮赋值
if (i == 0 && self.previousClickTabBarButton == nil) {
self.previousClickTabBarButton = tabBarBtn;
}
//点击实现方法
[tabBarBtn addTarget:self action:@selector(TabBarBtnClick:) forControlEvents:UIControlEventTouchUpInside];
}
}
- (void)TabBarBtnClick:(UIControl *)tabBarBtn
{
//判断 是否与上次点击按钮的属性 相等 相等就发出通知
if (self.previousClickTabBarButton == tabBarBtn) {
//发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"ZQTabBarButtonDidRepeatClickNotification" object:nil];
}
//赋值给属性
self.previousClickTabBarButton = tabBarBtn;
}
在你需要重复点击TabBar进行刷新的界面中,接收通知
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name:ZQTabBarButtonDidRepeatClickNotification object:nil];
}
在接收通知事件中,判断是否为当前页面与当前窗口,如果是那就执行刷新
- (void)tabBarButtonDidRepeatClick
{
//判断是否为当前界面
if (self.tableView.scrollsToTop == NO) return;
//判断是否为当前窗口
if (self.tableView.window == nil) return;
//刷新事件
[self HeaderBeginRefreshing];
}
网友评论