Objective c iOS以编程方式重新加载UITabViewController中的所有选项卡
我的应用程序有一个带3个选项卡的UITabViewController。前两个选项卡将从磁盘读取一些数据并显示(在前两个选项卡的viewDidLoad中完成) 第三个选项卡有一些配置信息。如果用户更改了第三个选项卡中的配置信息,我希望刷新前两个选项卡,即应重新调用viewDidLoad 我不能在前两个选项卡中使用ViewWill,因为从磁盘读取部分有点密集,我不想每次单击选项卡时都这样做。此外,在编辑第三个选项卡数据时,我还需要执行一些辅助任务(除了更新前两个选项卡),因此我希望在执行这些辅助任务时通过viewDidLoad重新加载选项卡。您可以使用Objective c iOS以编程方式重新加载UITabViewController中的所有选项卡,objective-c,ios,tabs,Objective C,Ios,Tabs,我的应用程序有一个带3个选项卡的UITabViewController。前两个选项卡将从磁盘读取一些数据并显示(在前两个选项卡的viewDidLoad中完成) 第三个选项卡有一些配置信息。如果用户更改了第三个选项卡中的配置信息,我希望刷新前两个选项卡,即应重新调用viewDidLoad 我不能在前两个选项卡中使用ViewWill,因为从磁盘读取部分有点密集,我不想每次单击选项卡时都这样做。此外,在编辑第三个选项卡数据时,我还需要执行一些辅助任务(除了更新前两个选项卡),因此我希望在执行这些辅助任
-(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链接,这真的没有什么帮助。如果你需要知道特定默认值何时发生