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



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

要记住的一个警告是,永远不要尝试在两个对象之间建立强引用,即不要让对象相互保留,否则会导致内存泄漏。

相关内容

最新更新