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?的主要内容,如果未能解决你的问题,请参考以下文章