iOS 点击UITabBar触发刷新

首先需要自定义一个UITabBarController (比如LLTabBarController)

由于UITabBarController已经遵守了UITabBarDelegate协议:

NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController 

所以在自定义的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];
}

你可能感兴趣的:(iOS 点击UITabBar触发刷新)