2017-06-29 49 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

我不明白你可以ü編輯我的整個代碼,所以我可以輕鬆獲得 –

相關問題