在我的应用中,我正在使用UINavigationController。我有一个“父”UIViewController和一个在堆栈上运行的“子”UIViewController。用户可以对孩子进行一些设置,这些设置稍后会影响父母。我使用NSUserDefaults来保存和检索数据,根据NSLog,它似乎工作正常。
我不清楚的是,一旦我从孩子身边回来,我该如何“刷新”数据。
让我更具体一点:在孩子中有一个“后退”按钮,它执行popViewControllerAnimated,然后我们回到父级。我想重新运行viewDidLoad中的所有方法,以便使用从NSUserDefaults数据中获得的更改来设置父视图字段。
任何人都可以指导和阐述吗?
答案 0 :(得分:4)
查看 NSNotification - 这是将代码的一部分发送到另一部分的简单方法,即Apple的内置NSNotification系统。
如果您要发送更新,请致电postNotificationName
。你只需给它一个你编写的唯一字符串(例如“ com.razeware.imagegrabber.imageupdated ”)和一个对象(例如刚下载完图像的ImageInfo)。
如果您想了解此更新何时发生,请致电addObserver:selector:name:object
。在我们的例子中,ImageListViewController将想知道何时发生这种情况,以便它可以重新加载适当的表视图单元格。放置它的好地方是viewDidLoad。
当视图被卸载时,不要忘记调用removeObserver:name:object
。否则,通知系统可能会尝试在卸载的视图上调用方法(或者更糟的是未分配的对象),这将是一件坏事!
通过Ray Wenderlich blog
答案 1 :(得分:2)
您可以使用NSUserDefaultsDidChangeNotification
作为刷新根视图控制器的触发器。
答案 2 :(得分:0)
您还可以将ViewController设置为NavigationViewController的委托
self.navigationController.delegate = self;
然后您将在方法中接收委托调用:
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animated {
NSLog(@"Did Show controller %@", viewController);
// Return from child
if ([viewController isKindOfClass:[SRPeopleViewController class]]) {
[self loadData];
}
}
此解决方案的小缺点或成本是您将收到超出您想要的呼叫数,因此必须进行过滤。