2017-06-29 53 views
0

我想在两个不同的视图控制器中使用perfrom segue传递JSON数据,并且很容易将数据传递给单个视图控制器或者它可能与否?如何将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!!") 
      } 

     } 
    } 

和我准备segue从哪里我想通过我的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

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

  1. 坚持磁盘上的数据,如果不是太复杂,大,你可以从你的初始视图控制器存储UserDefaults,然后从另外两个视图控制器访问UserDefaults。如果数据更复杂,则可能必须使用数据库框架(例如Realm或CoreData)。
  2. 如果您不需要将数据传递给可从所有视图控制器访问的特定类实例,则可以创建类的静态属性。
  3. 从您的第一个视图控制器通过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. 
    } 
} 
+0

u能请解释一下我的第二个选项? –

+0

我用一个简单的例子更新了我的答案。另外,如果你想了解更多关于我提到的第二个选项的内容,请查看[Type properties](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html)。 –

+0

我不明白你可以ü编辑我的整个代码,所以我可以轻松获得 –

相关问题