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

Posted

技术标签:

【中文标题】iOS:如何在弹出其子 UIViewController 后“刷新” UIViewController?【英文标题】:iOS: How to "Refresh" a UIViewController after Popping its Child UIViewController? 【发布时间】:2011-08-02 13:17:15 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

它是像“- (void) NSUserDefaultsDidChangeNotification ”这样的方法还是我应该在某个地方写的行(如果是,在哪里)? 不,它是您可以使用NSNotificationCenter 类注册的通知的名称。以下是关于通知主题的文档集:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…【参考方案3】:

您还可以将 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];
    

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

【讨论】:

以上是关于iOS:如何在弹出其子 UIViewController 后“刷新” UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何检测视图控制器是不是在弹出或关闭后出现

iOS如何在弹出顶视图控制器时以编程方式检测?

ios 键盘在弹出后无法点击

iOS 在弹出窗口中显示视图控制器

iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮

在弹出控制器时隐藏 iOS 7 中的导航栏