更新UITabBarController的所有视图控制器



我有一个四个选项卡的UITabBarController。在每个视图控制器中,当选项卡被选中时,我有一个重置按钮。点击按钮将改变所有视图控制器的外观。特别是,它会改变不同视图控制器中一些标签的文本。

是否有一些推荐的方法来更新UITabBarController的所有视图控制器在同一时间,即,使他们重新加载他们的视图?

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

@protocol XYReloadableViewController
- (void)reloadContents;
@end

,然后发送消息-reloadContents给所有的视图控制器,当按钮被点击:

- (IBAction)touchUpInsideResetButton {
    // ...
    NSArray *viewControllers = self.tabBarController.viewControllers;
    for (UIViewController<XYReloadableViewController> *viewController in viewControllers) {
        [viewController reloadContents];
    }
}

然后在每个视图控制器中我必须实现那个方法:

- (void)reloadContents {
    [self.tableView reloadData];
    // other updates to UI ...
}

但这似乎有点太复杂了。有没有更简单的方法告诉视图控制器重载它们的视图?


编辑:如果我在一些选项卡或容器视图控制器中呈现UINavigationController会发生什么?我需要沿着它的所有子视图控制器的链传递消息。

你可以创建ReloadViewController和所有你的控制器继承从他。

ReloadViewController有属性UIButton和方法

  1. - (void) reloadContents;
  2. (
  3. ) - IBAction touchUpInsideResetButton:发送者(id),

:

-(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];
}
viewControllers中的

只需要重写方法reloadContents

通知听起来更适合这个。当视图控制器需要重置时,广播一个NSNotification,并让任何可能需要重置自己的视图控制器侦听该通知,并触发它们需要做的事情。这样,不管它们在导航堆栈的多低,

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

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

最新更新