我有两个UIViewControllers,vc1和vc2。 vc1嵌入在嵌入UITabBarController的UIViewController中,但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
}
答案 0 :(得分:1)
首先,我从未养成使用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
要记住的一个警告是永远不要试图在两个对象之间有强引用,即没有对象相互保持或这将导致内存泄漏。