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

Objective c iOS以编程方式重新加载UITabViewController中的所有选项卡,objective-c,ios,tabs,Objective C,Ios,Tabs,我的应用程序有一个带3个选项卡的UITabViewController。前两个选项卡将从磁盘读取一些数据并显示(在前两个选项卡的viewDidLoad中完成) 第三个选项卡有一些配置信息。如果用户更改了第三个选项卡中的配置信息,我希望刷新前两个选项卡,即应重新调用viewDidLoad 我不能在前两个选项卡中使用ViewWill,因为从磁盘读取部分有点密集,我不想每次单击选项卡时都这样做。此外,在编辑第三个选项卡数据时,我还需要执行一些辅助任务(除了更新前两个选项卡),因此我希望在执行这些辅助任

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

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

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

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

如果不想在用户每次单击选项卡时重新加载数据,可以使用NSNotifications触发刷新。有关详细说明,请参见:

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


如果不想在用户每次单击选项卡时重新加载数据,可以使用NSNotifications触发刷新。有关详细说明,请参见:

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

我将使用
-(void)viewwillbeen:(BOOL)animated
。要避免从磁盘读取“有点密集”,您可以在第三个选项卡中的配置更改时设置一个标志,然后在其他选项卡中仅从磁盘读取(如果设置了该标志),使用NSNotifications执行此操作

由于第三个选项卡是您的配置设置,您可能希望将这些设置存储在
NSUserDefaults
中,因此请使用
nsUserDefaultsIDChangeNotification
viewDidLoad
方法中查看,并将重新加载的数据代码移动到自己的方法中

- (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
    }
}

使用NSNotifications来执行此操作

由于第三个选项卡是您的配置设置,您可能希望将这些设置存储在
NSUserDefaults
中,因此请使用
nsUserDefaultsIDChangeNotification
viewDidLoad
方法中查看,并将重新加载的数据代码移动到自己的方法中

- (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
    }
}


正如我提到的,我不能使用viewwillbeen,因为前两个选项卡的加载是一个密集的操作。好的,接下来的方法是使用NSNotifications。看一看。我会编辑答案。非常感谢。我已经为我的问题使用了通知。正如我所提到的,我不能使用ViewWillAppeal,因为前两个选项卡加载是一个密集的操作。好的,那么方法就是使用NSNotifications。看一看。我会编辑答案。非常感谢。我已经为我的问题使用了通知。是的,我可以这样做。我差点就开始了。但是想知道是否有其他方法可以触发viewDidLoad而不是添加这样的标志。当然可以调用方法
viewDidLoad
,与调用任何其他方法相同。但这意味着每个选项卡控制器都需要知道其他选项卡的情况,这些选项卡开始变得不必要的复杂。您可能希望研究使用委托,但这正是
viewwillbeen
的目的。手动调用viewDidLoad将非常糟糕。你不应该这么做。是的,我可以这么做。我差点就开始了。但是想知道是否有其他方法可以触发viewDidLoad而不是添加这样的标志。当然可以调用方法
viewDidLoad
,与调用任何其他方法相同。但这意味着每个选项卡控制器都需要知道其他选项卡的情况,这些选项卡开始变得不必要的复杂。您可能希望研究使用委托,但这正是
viewwillbeen
的目的。手动调用viewDidLoad将非常糟糕。你不应该这样做,谢谢。我得到了正确的通知。但是我如何过滤并找出userdefaults中更改的键呢?我在谷歌上搜索过,但在iOS上找不到多少与此相关的文档。我只得到了一些Mac OS链接,这并没有真正的帮助。如果您需要知道某个特定默认值何时发生了更改,那么您应该使用
addObserver:forKeyPath:options:context:
方法来查看该特定值。然后实现object:change:context:的方法
observeValueForKeyPath:ofObject:change:context:
来处理这个问题。如果我们已经注册了“SomeDefaultKey”,为什么还会为“SomeOtherKey”调用observeValueForKeyPath?不管怎样,当我尝试上述代码时,根本没有调用observerValueForKeyPath:(您可以注册多个密钥,因此,
SomeOtherKey
,作为您在方法中如何区分它们的示例。我认为您应该发布一个关于查看特定NSUserDefaults密钥的新问题,并在那里发布您的无效代码,我们可以帮助修复。是的,我认为这样做更好。谢谢。新的estion.Thank.我得到了正确的通知。但是我如何过滤并找出userdefaults中更改了哪些键?我在谷歌上搜索了,但在iOS上找不到与此相关的很多文档。我只得到了一些Mac OS链接,这真的没有什么帮助。如果你需要知道特定默认值何时发生