iOS以编程方式重新加载UITabViewController中的所有选项卡

时间:2012-05-28 09:57:41

标签: objective-c ios tabs

我的应用程序有一个带有3个选项卡的UITabViewController。前两个选项卡将从磁盘读取一些数据并显示它(在前两个选项卡的viewDidLoad中完成)。

第三个标签包含某种配置信息。如果用户在第三个选项卡中更改配置信息,我希望刷新前两个选项卡,即应重新调用viewDidLoad。

我不能在前两个选项卡中使用viewWillAppear,因为从磁盘部分读取是一种密集型,我不希望每次单击选项卡时都这样做。此外,我需要在编辑第三个选项卡数据时执行一些辅助任务(除了更新前两个选项卡),因此我想在执行这些辅助任务时通过viewDidLoad重新加载选项卡。

3 个答案:

答案 0 :(得分:3)

使用NSNotifications执行此操作。

由于第三个标签是您的配置设置,您可能希望将其存储在NSUserDefaults中,因此请使用NSUserDefaultsDidChangeNotificationviewDidLoad方法中注意这一点并移动reloadData代码进入自己的方法。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
    [notificationCenter addObserver:self
                           selector:@selector(userDefaultsChanged:)  
                               name:NSUserDefaultsDidChangeNotification
                             object:nil];

    [self reloadData];
}

现在,无论何时更改默认值,都会触发对方法userDefaultsChanged:的调用,请按如下方式添加方法。

- (void)userDefaultsChanged:(NSNotification *)notification
{
    [self reloadData];
}

- (void)viewDidUnload
{
    [super viewDidUnLoad];

    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

编辑:监视特定默认值的替代方法

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"SomeDefaultKey"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];

- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
    if([keyPath isEqual:@"SomeDefaultKey"])
    {
       // Do Something
    }
    if([keyPath isEqual:@"SomeOtherKey"])
    {
       // Do Something else
    }
}

答案 1 :(得分:1)

您可以使用-(void)viewWillAppear:(BOOL)animated方法触发其他两个视图控制器上的刷新。

如果您不想在每次用户单击Tab时重新加载数据,您可以使用NSNotifications来触发刷新。请参阅:http://www.numbergrinder.com/2008/12/patterns-in-objective-c-observer-pattern/

上的详细说明

答案 2 :(得分:1)

我会使用-(void)viewWillAppear:(BOOL)animated。为了解决从磁盘读取“强化”的问题,您可以在第3个选项卡中更改配置时设置标志,然后仅在设置了该标志的情况下从其他选项卡中的磁盘读取