實現(xiàn)功能:點擊tabBar,刷新當(dāng)前TableView,如圖:

模擬GIF.gif
方法一:
TabBar成為自己的代理,監(jiān)聽自己的點擊--這種方法不推薦,如果外面設(shè)置了代理會覆蓋里面的。
方法二:
既然找不到合適的控制器監(jiān)聽tabBar的點擊事件,那就讓AppDelegate來做代理,接收到點擊事件后,通過通知中心發(fā)送通知:
第一步:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
tabBarController.delegate = self;
}
再實現(xiàn)UITabBarControllerDelegate代理方法,拋出通知,
#pragma mark - UITabBarControllerDelegate
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"TabRefresh" object:nil userInfo:nil];
}
第二步:哪個控制器需要,就監(jiān)聽發(fā)出的通知。tableView所在的視圖控制器需要響應(yīng)點擊tabBar,所以在該控制器中監(jiān)聽發(fā)出的通知, 然后調(diào)用刷新方法. --注意:記錄上次選中的控制器,判斷本次點擊是否與上次一樣,并且是否為當(dāng)前顯示的控制器。
//監(jiān)聽點擊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://m.itdecent.cn/p/f6caf5fb1ef3
到這里,點擊tabBar實現(xiàn)當(dāng)前模塊刷新已實現(xiàn),但還有一個小問題,APP啟動后,初始主頁的控制器需要點擊兩次才能刷新,這是因為加載主頁控制器相當(dāng)于點擊了一次tabBar,然而實際并沒有點擊,此時self.lastVC為nil,需要第二次點擊才能刷新。這里提供一種方法,暫時沒有想到更好的方法。
在viewDidLayoutSubviews中加上
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (!self.lastVC) {
self.lastVC = self.tabBarController.selectedViewController;
}
}