//写在 自定义一的tabbar控制器里
@interface MainViewController : UITabBarController
//上面遵守代理
/** 之前被选中的UITabBarItem */
@property (nonatomic, strong) UITabBarItem *lastItem;
- (void)viewDidLoad {
[super viewDidLoad];
// 二次点击触发刷新将默认被选中的tabBarItem保存为属性
self.lastItem = self.tabBar.selectedItem;
}
//二次点击tabbar触发刷新代理方法
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
// 判断本次点击的UITabBarItem是否和上次的一样
if (item == self.lastItem) { // 一样就发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"LLTabBarDidClickNotification" object:nil userInfo:nil];
}
// 将这次点击的UITabBarItem赋值给属性
self.lastItem = item;
}
//在放在tabbar上的控制器里调用
// 监听UITabBarItem被重复点击时的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarDidClick) name:@"LLTabBarDidClickNotification" object:nil];
- (void)tabBarDidClick
{
// 如果本控制器的view显示在最前面,就下拉刷新(必须要判断,否点击其他tabbar也会触发刷新)
// 判断一个view是否显示在根窗口上,该方法在UIView的分类中实现
if ([self isShowingOnKeyWindow]) {
[self.tableView.mj_header beginRefreshing]; // MJRefresh
NSLog(@"触发tabbar刷新");
}
}
/** 该方法在UIView的分类中实现 */
- (BOOL)isShowingOnKeyWindow
{
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// 把这个view在它的父控件中的frame(即默认的frame)转换成在window的frame
CGRect convertFrame = [self.view.superview convertRect:self.view.frame toView: keyWindow];
CGRect windowBounds = keyWindow.bounds;
// 判断这个控件是否在主窗口上(即该控件和keyWindow有没有交叉)
BOOL isOnWindow = CGRectIntersectsRect(convertFrame, windowBounds);
// 再判断这个控件是否真正显示在窗口范围内(是否在窗口上,是否为隐藏,是否透明)
BOOL isShowingOnWindow = (self.view.window == keyWindow) && !self.view.isHidden && (self.view.alpha > 0.01) && isOnWindow;
return isShowingOnWindow;
}