【发布时间】:2017-05-23 16:48:03
【问题描述】:
我有两个 UIViewController,vc1 和 vc2。 vc1 嵌入在 UIViewController 中,UIViewController 嵌入在 UITabBarController 中,但 vc2 没有嵌入。
如何将信息从 vc2 传递到 vc1?用户执行操作后,数据被保存并且 vc2 简单地关闭,因此没有传递信息的 segue。显然我无法通过导航堆栈或 TabController 引用 vc1。
我可以保存到 AppDelegate,但我知道这不是一个好习惯。
这是我用来将信息从 AppDelegate 传递到 vc1 的代码,我在 vc2 中尝试过,但显然失败了。:
let tabBarController = window!.rootViewController as! UITabBarController
if let tabBarViewControllers = tabBarController.viewControllers {
let navPostViewController = tabBarViewControllers[0] as! UINavigationController
let user = User(context: managedObjectContext)
if user.userID != nil {
print("User is loggedIn")
isUserLoggedIn = true
} else {
print("User is not loggedIn")
isUserLoggedIn = false
}
let postViewController = navPostViewController.topViewController as! PostViewController
postViewController.managedObjectContext = managedObjectContext
}
【问题讨论】:
-
使用 AppDelegate 来保存这样的关键数据本质上没有任何问题。您还可以使用单例来保存您的数据模型。有些人会提倡写入 UserDefaults 来保存数据——但这似乎是登录状态等动态数据的错误方法。有些人肯定会反对这些方法 - 但您必须找到最适合您的方案的方法
-
VC1 是否存在 VC2(例如模态)?如果是这样,定义协议让 VC2 通知它的代理一些动作。然后,当 VC1 呈现 VC2 时,将 VC1 设置为 VC2 的代理。这比浏览视图控制器层次结构和/或使用应用程序委托(或任何其他对象)来保存通过 b/w VC2 和 VC1 传递的属性要好得多。
-
delegate绝对是您场景中更好的方式,也是苹果推荐的方式。 -
@Rob 你的冠军。自从我开始开发以来,我一直在关注你。
-
这可能是 Passing Data between View Controllers 的副本。看到这个Swift answer