现在很多的App都有点击UITabBarItem刷新页面的功能,例如网易云音乐,知乎,简书,微博......(也可以自定义tabbar实现双击刷新)
实现分三步
1.记录上次选中的tabBarItem,用于下次点击时判断是选择新控制器还是刷新
1.1 设置属性用以记录
@property (nonatomic, strong) UITabBarItem *lastItem;
1.2 viewWillAppear中赋值
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// 将默认被选中的tabBarItem保存为属性
self.lastItem = self.tabBar.selectedItem;
}
1.3 遵循UITabBarControllerDelegate,保存选中的item,如果这次点击的和上次的一样就发出通知让一些页面刷新
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
// 判断本次点击的UITabBarItem是否和上次的一样
if (item == self.lastItem) { // 一样就发出通知
SendNotify(TABBARDIDCLICK_NOTIFICATION, nil)
}
// 将这次点击的UITabBarItem赋值给属性
self.lastItem = item;
}
2. 控制器里监听通知进行刷新,但在刷新前需要判断该页面是否正在显示,不然注册通知的界面都会刷新
RegisterNotify(TABBARDIDCLICK_NOTIFICATION, @selector(tabBarDidClick))
- (void)tabBarDidClick
{
// 如果本控制器的view显示在最前面,就下拉刷新
if ([self.view isShowingOnKeyWindow]) { // 判断一个view是否显示在根窗口上,该方法在UIView的分类中实现
[self.scrollView.mj_header beginRefreshing]; // MJRefresh
}
}
- (void)dealloc{
RemoveNofifys(TABBARDIDCLICK_NOTIFICATION, nil)
}
2.1判断当前view是否正在显示,为UIView添加一个分类方法
- (BOOL)isShowingOnKeyWindow
{
// 主窗口
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// 以主窗口左上角为坐标原点, 计算self的矩形框
CGRect newFrame = [keyWindow convertRect:self.frame fromView:self.superview];
CGRect winBounds = keyWindow.bounds;
// 主窗口的bounds 和 self的矩形框 是否有重叠
BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
return !self.isHidden && self.alpha > 0.01 && self.window == keyWindow && intersects;
}