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

时间:2011-08-02 13:17:16

标签: ios uiviewcontroller uinavigationcontroller nsuserdefaults setneedsdisplay

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

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

让我更具体一点:在孩子中有一个“后退”按钮,它执行popViewControllerAnimated,然后我们回到父级。我想重新运行viewDidLoad中的所有方法,以便使用从NSUserDefaults数据中获得的更改来设置父视图字段。

  1. 在父方法中我应该告诉视图“刷新”?
  2. 如何执行此刷新操作?我应该再次调用viewDidLoad吗?我读到了一些名为setNeedsDisplay的内容,如果这是我应该使用的东西,那么语法是什么(是“[self。view setNeedsDisplay]”还是其他的东西)?
  3. 任何人都可以指导和阐述吗?

3 个答案:

答案 0 :(得分:4)

查看 NSNotification - 这是将代码的一部分发送到另一部分的简单方法,即Apple的内置NSNotification系统。

  1. 如果您要发送更新,请致电postNotificationName。你只需给它一个你编写的唯一字符串(例如“ com.razeware.imagegrabber.imageupdated ”)和一个对象(例如刚下载完图像的ImageInfo)。

  2. 如果您想了解此更新何时发生,请致电addObserver:selector:name:object。在我们的例子中,ImageListViewController将想知道何时发生这种情况,以便它可以重新加载适当的表视图单元格。放置它的好地方是viewDidLoad。

  3. 当视图被卸载时,不要忘记调用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];
    }

}

此解决方案的小缺点或成本是您将收到超出您想要的呼叫数,因此必须进行过滤。