iOS 点击UITabBar触发刷新

作者: 缔造福地 | 来源:发表于2016-04-01 15:01 被阅读3321次
首先需要自定义一个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];
}

相关文章

网友评论

  • 孤独的剑客:点了很多次,就一直刷新么?
  • YungFan:isShowingOnKeyWindow 这个方法牛逼
    缔造福地:@YungFan 有帮助就好
  • macfai:楼主的思路真牛逼,帮我解决了一个大问题,非常感谢,请问能加下你qq吗?或者你有qq群吗?方便交流问题
    macfai:@缔造福地 你的扣扣需要验证真名:grin:
    macfai:@缔造福地 好的,多谢:smile::smile:
    缔造福地:@macfai 不用客气。我的qq453269852,我也加入了几个qq群。推荐群号72671667,共同学习。
  • feng_dev:UITabcontroller 的 代理 的 怎么写 ?有什么差别?
    缔造福地:@枫子哥 哦,这我还真没试过。不过也看你写的文章了。现在这个功能的实现还有问题吗?
    feng_dev:@缔造福地 额 ,我说的是 2 个 不同的 代理
    一个 是 UITabbar delegate 一个是 UItabbar Controller delegate
    你实现的 代理方法 是 UITabbar 的 代理方法 ,是不用设置代理的 ,设置了反而会出错,
    这两个 代理都有 监听 item的点击的功能 ,而且 这两个 方法 应该可以同时实现 ,网上有的博客说 有冲突,说 一个 会覆盖 一个 ,我测试的 都能log
    缔造福地:@枫子哥 不好意思现在才看到评论。而且不怎么明白你的意思,不知道你是不是指“自定义的继承UITabBarController的控制器”?如果是这个问题的话,实际上,自定上的继承UITabBarController的控制器中是不需要设置代理的,它的父类UITabBarController已经有了代理,所以自定义的控制器就不需要设置了

本文标题:iOS 点击UITabBar触发刷新

本文链接:https://www.haomeiwen.com/subject/twrylttx.html