2

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

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

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

  1. 我应该在父方法中的哪个位置告诉视图“刷新”?
  2. 如何执行此刷新操作?我应该再次调用 viewDidLoad 吗?我读到了一个叫做 setNeedsDisplay 的东西,如果那是我应该使用的东西,语法是什么(是“[self.view setNeedsDisplay]”还是其他东西)?

任何人都可以指导和详细说明吗?

4

3 回答 3

4

看看NSNotification - Apple 内置的 NSNotification 系统是一种将更新从代码的一部分发送到另一部分的简单方法。

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

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

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

于 2011-08-02T15:49:33.107 回答
2

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

于 2011-08-02T13:40:51.007 回答
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];
    }

}

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

于 2014-12-08T14:31:57.000 回答