现在很多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都会刷新。