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

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