美文网首页iOS iOS从头开始做一个APPiOS学习笔记
监听TabBar的点击,实现重复点击TabBarItem可以刷新

监听TabBar的点击,实现重复点击TabBarItem可以刷新

作者: 上升的羽毛 | 来源:发表于2016-07-01 22:20 被阅读2465次

    现在很多App重复点击TabBarItem都可以刷新当前界面,可以通过通知的方式来监听TabBarItem的点击

    1.来到AppDelegate中发出通知,先遵守<UITabBarControllerDelegate>

    @interface AppDelegate ()<UITabBarControllerDelegate>
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        //创建一个带导航的根控制器
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
        UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:[[OtherViewController alloc] init]];
    
        UITabBarController *tabBarController = [[UITabBarController alloc] init];
        tabBarController.viewControllers = @[nav,nav1];
        
        nav.tabBarItem.title = @"消息";
        nav1.tabBarItem.title = @"发现";
        
        self.window.rootViewController = tabBarController;
        
        tabBarController.delegate = self;
        return YES;
    }
    
    //UITabBarController代理方法
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
        
        static NSString *tabBarDidSelectedNotification = @"tabBarDidSelectedNotification";
        //当tabBar被点击时发出一个通知
        [[NSNotificationCenter defaultCenter] postNotificationName:tabBarDidSelectedNotification object:nil userInfo:nil];
        
        
    }
    
    
    

    2.来到需要监听TabBarItem的选中的控制器

    
    @interface ViewController ()
    
    /** 上次选中的索引(或者控制器) */
    @property (nonatomic, assign) NSInteger lastSelectedIndex;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        static NSString *tabBarDidSelectedNotification = @"tabBarDidSelectedNotification";
        //注册接收通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarSeleted) name:tabBarDidSelectedNotification object:nil];
    }
    
    // 接收到通知实现方法
    - (void)tabBarSeleted {
        
        // 如果是连续选中2次, 直接刷新
        if (self.lastSelectedIndex == self.tabBarController.selectedIndex && [self isShowingOnKeyWindow]) {
            
            //直接写刷新代码
            
        }
        
        // 记录这一次选中的索引
        self.lastSelectedIndex = self.tabBarController.selectedIndex;
        
    }
    
    /**
     * 判断一个控件是否真正显示在主窗口
     */
    - (BOOL)isShowingOnKeyWindow
    {
        // 主窗口
        UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
        
        // 以主窗口左上角为坐标原点, 计算self的矩形框
        CGRect newFrame = [keyWindow convertRect:self.view.frame fromView:self.view.superview];
        CGRect winBounds = keyWindow.bounds;
        
        // 主窗口的bounds 和 self的矩形框 是否有重叠
        BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
        
        return !self.view.isHidden && self.view.alpha > 0.01 && self.view.window == keyWindow && intersects;
    }
    
    
    

    类似网易新闻首页,不同的控制器View添加到一个ScrollView上,这个时候就需要判断手机显示的是哪个控制器View,就需要用到上面<判断一个控件是否真正显示在主窗口>的这个方法,如果没有这个判断,点击两次Item,所有添加到ScrollView上的控制器View都会刷新。

    相关文章

      网友评论

      本文标题:监听TabBar的点击,实现重复点击TabBarItem可以刷新

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