更新UITabBarController的所有视图控制器

时间:2014-05-30 09:54:28

标签: ios uitabbarcontroller reloaddata

我有一个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会怎样?我需要沿着所有子视图控制器的链传递消息......

2 个答案:

答案 0 :(得分:3)

您可以创建ReloadViewController和所有controllers继承 从他身上。

ReloadViewController具有属性UIButton和方法:

  1. - (无效)reloadContents;
  2. - (IBAction为)touchUpInsideResetButton:(ID)发送者;
  3. 在.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

答案 1 :(得分:2)

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

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

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