0

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

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

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

4

3 回答 3

3

使用 NSNotifications 来做到这一点。

由于第三个选项卡是您的配置设置,因此您可能希望将这些设置存储在其中,NSUserDefaults因此请使用NSUserDefaultsDidChangeNotification来在您的viewDidLoad方法中注意这一点,并将您的 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
    }
}
于 2012-05-28T10:32:28.603 回答
1

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

如果您不想在每次用户单击选项卡时重新加载数据,您可以使用 NSNotifications 来触发刷新。详细解释见:http ://www.numbergrinder.com/2008/12/patterns-in-objective-c-observer-pattern/

于 2012-05-28T10:02:05.717 回答
1

我会用-(void)viewWillAppear:(BOOL)animated. 为了避免从磁盘读取“有点密集”,您可以在第三个选项卡中的配置更改时设置一个标志,然后如果设置了该标志,则仅在其他选项卡中从磁盘读取

于 2012-05-28T10:04:50.863 回答