参考了网上众多教程,总算发现该怎么实现。

之中也有我自己的改进,记录一下,留给有缘人。

首先。不在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去掉即可。