我有两个UIViewControllers,vc1和vc2.vc1嵌入在UIViewController中,UIViewController嵌入UITabBarController中,但vc2没有嵌入其中。
如何将信息从 vc2 传递到 vc1? 用户执行操作后,数据将被保存,vc2 只是关闭,因此没有传递信息的 segue。 显然,我无法通过导航堆栈或选项卡控制器引用 vc1。
我可以保存到应用程序代表,但我读到这不是一个好的做法。
这是我用来将信息从 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
}
首先,我从来没有养成使用 segue 传递信息的习惯。我建议在需要在两个对象之间传递数据时实现委托模式。它干净多了。
例如,假设您想在 LoginViewController 和 PostViewController 之间传递数据:
protocol LoginViewControllerDelegate:NSObjectProtocol{
func userDidLogin(data:String)
}
class LoginViewController:UIViewController {
weak var delegate:LoginViewControllerDelegate?
...
@IBAction func loginButtonPressed(sender:UIButton) {
//Perform login logic here
//If successful, tell the other controller or the 'delegate'
self.delegate?.userDidLogin(data:"Some data....")
}
}
class PostViewController:UIViewController, LoginViewControllerDelegate {
func userDidLogin(data:String) {
print("Got data from login controller: (data)")
}
}
//How you might use this
loginViewController.delegate = postViewController
要记住的一个警告是,永远不要尝试在两个对象之间建立强引用,即不要让对象相互保留,否则会导致内存泄漏。