更新 UITabBarController 的所有视图控制器

Posted

技术标签:

【中文标题】更新 UITabBarController 的所有视图控制器【英文标题】:Update all view controllers of a UITabBarController 【发布时间】:2014-05-30 09:54:28 【问题描述】:

我有一个带有四个标签的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,会发生什么情况?我需要沿着其所有子视图控制器的链传递消息...

【问题讨论】:

【参考方案1】:

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

ReloadViewController 有属性 UIButton 和方法:

    -(void)reloadContents; -(IBAction)touchUpInsideResetButton:(id)sender;

在 .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];

在你的 viewControllers 中只需要覆盖方法 reloadContents

【讨论】:

感谢您的代码建议。我想这是对@Nevan 答案的一个很好的补充。【参考方案2】:

通知听起来更适合这种情况。当需要重置视图控制器时,广播NSNotification 并让任何可能需要重置自己的视图控制器监听该通知,并触发他们需要做的事情。这样一来,它们在导航堆栈中的位置就无关紧要了。

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

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

【讨论】:

感谢详细的概念!

以上是关于更新 UITabBarController 的所有视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何实时更新 UITabBarController 外观?

如何防止 UITabBarController 更新子视图?

如何更新 UITabbarController 中的默认徽章 UI 外观?

UITabBarController 未显示其内容的所有大小(UIViewController)

如果我使用 UITabBarController,是不是需要在所有屏幕中添加导航栏项目?

如何在 UITabBarController 中加载所有视图?