iOS:如何在popup其子UIViewController后“刷新”UIViewController?

在我的应用程序我使用UINavigationController。 我有一个“父母”UIViewController和一个“孩子”UIViewController在堆栈上运行。 用户可以对孩子进行一些设定,这些设定稍后会影响父母。 我使用NSUserDefaults来保存和检索数据,并根据NSLog似乎工作正常。

我不清楚的是,一旦我从孩子回来,我该如何“刷新”数据。

让我更具体:在孩子有一个“后退”button,做popViewControllerAnimated,然后我们回到父母。 我想重新运行我在viewDidLoad中的所有方法,所以父视图字段与我从NSUserDefaults数据中获得的更改一起设置。

  1. 哪里在父方法我应该告诉视图“刷新”?
  2. 我如何做这个刷新行动? 我应该再次调用viewDidLoad? 我读了一些名为setNeedsDisplay的东西,如果这是我应该使用的东西,语法是什么(是“[self。view setNeedsDisplay]”还是别的)?

任何人都可以指导和阐述?

看看NSNotification – 这是一个简单的方法,从您的代码的一部分发送更新到另一个是苹果公司的内置NSNotification系统。

  1. 如果您想要发送更新,请调用postNotificationName 。 你只要给它一个唯一的string(比如“ com.razeware.imagegrabber.imageupdated ”)和一个对象(比如刚刚下载完图像的ImageInfo )。

  2. 如果你想addObserver:selector:name:object这个更新何时发生,你可以调用addObserver:selector:name:object 。 在我们的例子中,ImageListViewController会想知道什么时候发生这种情况,所以它可以重新加载适当的表格视图单元格。 放在这里的一个好地方是viewDidLoad。

  3. 当视图被卸载时,不要忘记调用removeObserver:name:object 。 否则,通知系统可能试图调用一个方法在一个未加载的视图(或更糟糕的未分配的对象),这将是一件坏事! 通过Ray Wenderlich 博客

您可以使用NSUserDefaultsDidChangeNotification作为刷新根视图控制器的触发器。

您也可以将您的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]; } 

}

此解决scheme的小缺点 – 或成本 – 是您将收到更多的电话,因此过滤是必要的。