我的应用程序有一个带有3个选项卡的UITabViewController。前两个选项卡将从磁盘读取一些数据并显示它(在前两个选项卡的viewDidLoad中完成)。
第三个标签包含某种配置信息。如果用户在第三个选项卡中更改配置信息,我希望刷新前两个选项卡,即应重新调用viewDidLoad。
我不能在前两个选项卡中使用viewWillAppear,因为从磁盘部分读取是一种密集型,我不希望每次单击选项卡时都这样做。此外,我需要在编辑第三个选项卡数据时执行一些辅助任务(除了更新前两个选项卡),因此我想在执行这些辅助任务时通过viewDidLoad重新加载选项卡。
答案 0 :(得分: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
}
}
答案 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个选项卡中更改配置时设置标志,然后仅在设置了该标志的情况下从其他选项卡中的磁盘读取