参考了网上众多教程,总算发现该怎么实现。
之中也有我自己的改进,记录一下,留给有缘人。
首先。不在viewcontroller中写代理回调方法,因为我并不是在那里定义的UITabBarController。
建议在哪定义,在哪里就加代理和回调方法。
我在AppDelegate.h中添加的,
基本操作如下:
1.添加UITabBarControllerDelegate代理
@interface AppDelegate:UIResponder <UIApplicationDelegate,UITabBarControllerDelegate>
2.在创建UITabBarController实例的地方应用代理
//创建分栏控制器
UITabBarController* FYXtbar = [[UITabBarController alloc] init];
FYXtbar.tabBar.tintColor = [UIColor colorWithRed:103.0/255.0 green:170.0/255.0 blue:239.0/255.0 alpha:1.0];
//创建一个控制器数组对象
//将所有的要被分栏控制器管理的对象添加到数组中
NSArray* NavList = [NSArray arrayWithObjects:HSPNav,
MSPNav,
SSPNav, nil];
//将分栏视图控制器管理数组赋值
FYXtbar.viewControllers = NavList;
//设置分栏控制器的透明度
FYXtbar.tabBar.translucent = NO;
//重点在这 。。应用代理
FYXtbar.delegate = self;
//将分栏控制器作为根视图控制器
self.window.rootViewController = FYXtbar;
3.编写事件响应的回调方法
我参考的那篇教程只是用第一个tabbar作为案例,而他获取第一个tabbar的viewcontroller对象是通过
[tabBarController.viewControllers firstObject]
作为小白,我还以为获取第二个tabbar的viewcontroller对象是secondObject,还是我太天真的,根本没有。。。
最后,查看tabBarController.viewControllers可用的调用方法
发现通过下面这种方式获取到viewcontroller对象
//0 代表第一个tabbar,1 代表第二个,2代表第三个
[tabBarController.viewControllers objectAtIndex:1]
因此,回调方法的如下:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
// 确保当前显示的是首页界面,本例中首页是第一个 tabBar
if ([tabBarController.selectedViewController isEqual:[tabBarController.viewControllers objectAtIndex:0]]) {
// 再次选中的 tab 页面是之前上一次选中的控制器页面
if ([viewController isEqual:tabBarController.selectedViewController]) {
// 发送通知,让首页刷新数据
NSLog(@"首页双击刷新页面");
//这里我用通知的形式刷新首页
dispatch_async(dispatch_get_main_queue(), ^{
// 发送通知
NSLog(@"在AppDelegate发送通知,双击刷新index");
[[NSNotificationCenter defaultCenter] postNotificationName:@"indexreload" object:nil userInfo:nil];
});
return NO;
}
}else if ([tabBarController.selectedViewController isEqual:[tabBarController.viewControllers objectAtIndex:1]]) {
// 再次选中的 tab 页面是之前上一次选中的控制器页面
if ([viewController isEqual:tabBarController.selectedViewController]) {
// 发送通知,让第二个tabbar刷新数据
return NO;
}
}else if ([tabBarController.selectedViewController isEqual:[tabBarController.viewControllers objectAtIndex:2]]) {
// 再次选中的 tab 页面是之前上一次选中的控制器页面
if ([viewController isEqual:tabBarController.selectedViewController]) {
// 发送通知,让第三个tabbar刷新数据
NSLog(@"设置双击刷新角标");
return NO;
}
}
return YES;
}
应该知道怎么用通知吧?不懂就看IOS菜鸟初学第七篇:整理一些IOS开发中(基于wkwebview)可能用到的小技能,IOS12.2亲测可用的消息监听通知,可用于执行其他页面的刷新等操作
至于点击刷新,把判断双击的判断条件if去掉即可。