iOS技巧:点击tabBar实现当前模块刷新

2016-08-14  本文已影响528人  hudingyu

实现功能:点击tabBar,刷新当前TableView,如图:


模拟GIF.gif

方法一:
TabBar成为自己的代理,监听自己的点击--这种方法不推荐,如果外面设置了代理会覆盖里面的。

方法二:
既然找不到合适的控制器监听tabBar的点击事件,那就让AppDelegate来做代理,接收到点击事件后,通过通知中心发送通知:
第一步:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    tabBarController.delegate = self;
}

再实现UITabBarControllerDelegate代理方法,抛出通知,

#pragma mark - UITabBarControllerDelegate

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TabRefresh" object:nil userInfo:nil];
}

第二步:哪个控制器需要,就监听发出的通知。tableView所在的视图控制器需要响应点击tabBar,所以在该控制器中监听发出的通知, 然后调用刷新方法. --注意:记录上次选中的控制器,判断本次点击是否与上次一样,并且是否为当前显示的控制器。

//监听点击TabBar的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarClick) name:@"TabRefresh" object:nil];


- (void)tabBarClick
{
    if (self.tabBarController.selectedViewController == self.lastVC && [self.view isShowingOnKeyWindow]) {
        [self.tableView.mj_header beginRefreshing];
    }
    
    self.lastVC = self.tabBarController.selectedViewController;
}

isShowingOnKeyWindow 见链接:http://www.jianshu.com/p/f6caf5fb1ef3

到这里,点击tabBar实现当前模块刷新已实现,但还有一个小问题,APP启动后,初始主页的控制器需要点击两次才能刷新,这是因为加载主页控制器相当于点击了一次tabBar,然而实际并没有点击,此时self.lastVC为nil,需要第二次点击才能刷新。这里提供一种方法,暂时没有想到更好的方法。

在viewDidLayoutSubviews中加上

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if (!self.lastVC) {
        self.lastVC = self.tabBarController.selectedViewController;
    }
}
上一篇下一篇

猜你喜欢

热点阅读