如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?

Posted

技术标签:

【中文标题】如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?【英文标题】:how to pass JSON data from login view to multiple view controller, is it possible or not?如何将 JSON 数据从登录视图传递到多个视图控制器,是否可能? 【发布时间】:2017-06-29 09:34:07 【问题描述】:

我正在尝试使用 perfrom segue 在两个不同的视图控制器中传递 JSON 数据,并且很容易将数据传递给单个视图控制器,或者是否可能?

func getlogin()
        let headers = [
            "Content-Type": "application/x-www-form-urlencoded"
        ]
        let parameters = [

            "UserName": username_textfield.text! as String,
            "Password": password_textfield.text! as String,
            "grant_type": "password",
            ]


        //        let url = NSURL(string: "http://192.168.100.5:84/Token")!
        Alamofire.request("http://192.168.100.5:84/Token", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON  (response:DataResponse<Any>) in

            switch(response.result) 
            case.success(let data):
                print("success",data)
                 let statusCode = (response.response?.statusCode)!

//                self.myResponse = JSON(data)
//                let login = Login(loginJson: self.myResponse)

                if statusCode == 200
                    self.view.makeToast(message: "Welcome !!")

                    self.myResponse = JSON(data)
                    let login = Login(loginJson: self.myResponse)
                    DispatchQueue.main.async(execute:  () -> Void in
                        self.performSegue(withIdentifier: "dashboard", sender: login)
                        self.performSegue(withIdentifier: "rear_view", sender: login)

                    )

//
                else
                    self.view.makeToast(message: "Username or password invalid")
                



            case.failure(let error):
                print("Not Success",error)
                self.view.makeToast(message: "Server Error!!")
            

        
    

我准备从哪里传递我的 JSON 数据?

override  func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "dashboard" 
            let navController = segue.destination as! UINavigationController
            if let detailController = navController.topViewController as? ViewController,
                let loginData = sender as? Login 
                detailController.login_details = loginData
            


 
    if segue.identifier == "rear_view" 

        let navController = segue.destination as! UINavigationController
        if let dc = navController.topViewController as? MenuDrawerViewController,
                        let loginData = sender as? Login 
                        dc.login_details = loginData
                    

    

当用户登录 JSON 数据被传递给 viewController 但没有传递给 MenuViewController 时,试图在两个视图控制器中传递数据,如何解决这个问题?或者需要一些建议?

【问题讨论】:

【参考方案1】:

由于只能segue到单个控制器,因此不能直接将数据传递给prepare(for segue)中的多个ViewControllers。 但是,您有几种方法可以在多个视图控制器之间传递数据。

    持久化磁盘上的数据,如果不是太复杂和太大,你可以从你的初始视图控制器将它存储在UserDefaults,然后从你的其他两个视图控制器访问UserDefaults。如果数据更复杂,您可能必须使用数据库框架(例如 Realm 或 CoreData)。 如果您不需要将数据传递给特定的类实例,您可以创建类的静态属性,您可以从所有视图控制器访问该实例。 通过第一个视图控制器的 segue 传递两个视图控制器所需的数据,然后在从第二个视图控制器进行 segue 时传递第三个视图控制器所需的数据。但是,这仅适用于少数视图控制器,并且仅当您只能从您之前将数据发送到的视图控制器中切换到视图控制器。

编辑:使用静态属性的示例:

class FirstVC: UIViewController   //this is your initial view controller
    ...
    let login = Login(loginJson: self.myResponse)
                ThirdVC.login = loginData
                DispatchQueue.main.async(execute:  () -> Void in
                    self.performSegue(withIdentifier: "dashboard", sender: login)
                )
    ...


class SecondVC: UIViewController   // you segue here from FirstVC



class ThirdVC: UIViewController  //you segue here from SecondVC
    static var login: Login?
    override function viewDidLoad()
       super.viewDidLoad()
       print(ThirdVC.login) // you can access the data sent from your FirstVC like this anywhere in ThirdVC.
    

【讨论】:

你能解释一下第二个选项吗?? 我用一个简单的例子更新了我的答案。另外,如果您想了解有关我提到的第二个选项的更多信息,请查看Type properties。 我不明白你能不能用我的整个代码编辑,这样我就可以轻松搞定 我使用了您的第一个选项,因为我没有复杂的数据谢谢您的好建议。快乐编码!!!

以上是关于如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?的主要内容,如果未能解决你的问题,请参考以下文章

如何将从 json 检索到的数据从一个视图传递到另一个视图? [复制]

如何将数据从视图控制器传递到标签栏控制器以及导航控制器?

Swift 3:将数据从 TabBarController 传递到子视图控制器

如何从ajax将多个json数组传递给控制器​​?

将数组从 AuthController 传递到 Laravel 5 中的登录视图

如何使用委托将数据从多个视图控制器传递回根视图控制器? IOS 7