iOS iOS从头开始做一个APPiOS学习笔记

监听TabBar的点击,实现重复点击TabBarItem可以刷新

2016-07-01  本文已影响2465人  上升的羽毛

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

上一篇下一篇

猜你喜欢

热点阅读