Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更新UITabBarController的所有视图控制器_Ios_Uitabbarcontroller_Reloaddata - Fatal编程技术网

Ios 更新UITabBarController的所有视图控制器

Ios 更新UITabBarController的所有视图控制器,ios,uitabbarcontroller,reloaddata,Ios,Uitabbarcontroller,Reloaddata,我有一个带有四个选项卡的UITabBarController。在选择选项卡时显示的每个视图控制器中,我都有一个重置按钮。点击该按钮将更改所有视图控制器的外观。特别是,它将更改不同视图控制器中某些标签的文本 是否有一些推荐的方法可以同时更新UITabBarController的所有视图控制器,即让它们重新加载视图 我当前的方法是使这些视图控制器符合协议 @protocol XYReloadableViewController - (void)reloadContents; @end 然后点击按钮

我有一个带有四个选项卡的
UITabBarController
。在选择选项卡时显示的每个视图控制器中,我都有一个重置按钮。点击该按钮将更改所有视图控制器的外观。特别是,它将更改不同视图控制器中某些标签的文本

是否有一些推荐的方法可以同时更新
UITabBarController
的所有视图控制器,即让它们重新加载视图

我当前的方法是使这些视图控制器符合协议

@protocol XYReloadableViewController
- (void)reloadContents;
@end
然后点击按钮时,向所有视图控制器发送消息
-reloadContents

- (IBAction)touchUpInsideResetButton {
    // ...
    NSArray *viewControllers = self.tabBarController.viewControllers;
    for (UIViewController<XYReloadableViewController> *viewController in viewControllers) {
        [viewController reloadContents];
    }
}
但这似乎有点太复杂了。那么,有没有更简单的方法来告诉视图控制器重新加载视图



编辑:如果在某些选项卡或容器视图控制器中显示
UINavigationController
,会发生什么?我需要沿着其所有子视图控制器的链传递消息…

通知听起来更适合于此。当视图控制器需要重置时,广播一个
NSNotification
,让任何可能需要重置自身的视图控制器侦听该通知,并触发它们需要执行的操作。这样一来,它们在导航堆栈中到底有多远都无关紧要

您可能希望推迟更新,直到视图实际出现。当VCs收到通知时,您可以设置
BOOL
needsUpdate
,但只能在
视图中显示实际更新:
,以节省资源并防止大量更新同时发生(可能会阻塞主线程)


如果此行为对所有视图控制器都是常见的,则创建一个
UIViewController
子类以防止重复代码,并使它们都继承自该子类。或者,(如果您使用的是Apple VC子类)在
UIViewController
上创建一个类别以添加通知方法。

您可以创建ReloadViewController和所有控件 从他那里

ReloadViewController具有属性UIButton和方法:

  • -(无效)重新加载内容
  • -(iAction)触碰内部设置按钮:(id)发送方 在.m文件中:

    -(void)viewDidLoad
    {
      [super viewDidLoad];
      [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(reloadContents)
                                                     name:@"MyNotification"
                                                   object:nil];
    }
    
    - (IBAction)touchUpInsideResetButton:(id)sender
    {
      [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" 
                                                          object:nil];
    }
    

    在您的视图中,控制器只需覆盖方法重载内容

    谢谢您提供的详细概念!谢谢你的代码建议。我想这是对@Nevan答案的一个很好的补充。
    -(void)viewDidLoad
    {
      [super viewDidLoad];
      [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(reloadContents)
                                                     name:@"MyNotification"
                                                   object:nil];
    }
    
    - (IBAction)touchUpInsideResetButton:(id)sender
    {
      [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" 
                                                          object:nil];
    }