更新 UITabBarController 的所有视图控制器

Mis*_*cha 5 uitabbarcontroller reloaddata ios

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

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

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

@protocol XYReloadableViewController
- (void)reloadContents;
@end
Run Code Online (Sandbox Code Playgroud)

然后-reloadContents在点击按钮时将消息发送到所有视图控制器:

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

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

- (void)reloadContents {
    [self.tableView reloadData];
    // other updates to UI ...
}
Run Code Online (Sandbox Code Playgroud)

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


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

nev*_*ing 2

通知听起来更适合这个。当视图控制器需要重置时,广播并NSNotification让任何可能需要重置自身的视图控制器监听该通知,并触发它们需要执行的操作。这样,它们在导航堆栈中的位置就无关紧要了。

您可能希望推迟更新,直到视图实际出现。您可以设置BOOL needsUpdateVC 何时收到通知,但只在 中进行实际更新viewWillAppear:,以节省资源并防止立即进行大量更新(并且可能会阻塞主线程)。

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