首先需要自定义一个UITabBarController
(比如LLTabBarController
)
由于UITabBarController
已经遵守了UITabBarDelegate
协议:
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding>
所以在自定义的LLTabBarController
中直接实现UITabBarDelegate
协议中的方法监听UITabBar
的点击就可:
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item;
在监听UITabBar
点击的方法中判断本次点击的UITabBarItem
和上次点击的是否一样,如果一样就发出通知
- 要判断本次点击的
UITabBarItem
和上次点击的是否一样,就需要定义一个属性记录下来上次点击的UITabBarItem
,并在viewWillAppear:
方法中给该属性赋值默认的UITabBarItem
/** 之前被选中的UITabBarItem */
@property (nonatomic, strong) UITabBarItem *lastItem;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// 将默认被选中的tabBarItem保存为属性
self.lastItem = self.tabBar.selectedItem;
}
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
// 判断本次点击的UITabBarItem是否和上次的一样
if (item == self.lastItem) { // 一样就发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"LLTabBarDidClickNotification" object:nil userInfo:nil];
}
// 将这次点击的UITabBarItem赋值给属性
self.lastItem = item;
}
在需要实现点击UITabBar触发刷新功能的控制器中监听通知
- (void)viewDidLoad {
[super viewDidLoad];
// 监听UITabBarItem被重复点击时的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarDidClick) name:@"LLTabBarDidClickNotification" object:nil];
}
- (void)tabBarDidClick
{
// 如果本控制器的view显示在最前面,就下拉刷新
if ([self.view isShowingOnKeyWindow]) { // 判断一个view是否显示在根窗口上,该方法在UIView的分类中实现
[self.tableView.header beginRefreshing]; // MJRefresh
}
}
判断一个view是否显示在根窗口上
/** 该方法在UIView的分类中实现 */
- (BOOL)isShowingOnKeyWindow
{
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// 把这个view在它的父控件中的frame(即默认的frame)转换成在window的frame
CGRect convertFrame = [self.superview convertRect:self.frame toView: keyWindow];
CGRect windowBounds = keyWindow.bounds;
// 判断这个控件是否在主窗口上(即该控件和keyWindow有没有交叉)
BOOL isOnWindow = CGRectIntersectsRect(convertFrame, windowBounds);
// 再判断这个控件是否真正显示在窗口范围内(是否在窗口上,是否为隐藏,是否透明)
BOOL isShowingOnWindow = (self.window == keyWindow) && !self.isHidden && (self.alpha > 0.01) && isOnWindow;
return isShowingOnWindow;
}
在控制器销毁时要移除通知
- (void)dealloc
{
// 移除通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
}