尝试在控制器之间传递信息失败,但从AppDelegate到控制器

时间:2017-05-23 16:48:03

标签: swift uiviewcontroller

我有两个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
        }

1 个答案:

答案 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

要记住的一个警告是永远不要试图在两个对象之间有强引用,即没有对象相互保持或这将导致内存泄漏。