实现功能:点击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;
}
}
网友评论