как передать данные JSON из представления входа в систему с несколькими представлениями, возможно ли это или нет?

Я пытаюсь передать данные JSON в два разных контроллера представления, используя perfrom segue, и легко передать данные в контроллер одного представления, или это возможно или нет?

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, пытаясь передать данные в оба контроллера представления, как можно решить эту проблему? или нужны предложения?


person Bikesh Thakur    schedule 29.06.2017    source источник


Ответы (1)


Поскольку вы можете перейти только к одному контроллеру, вы не можете напрямую передавать данные нескольким ViewController в prepare(for segue). Однако у вас есть несколько методов для передачи данных между несколькими контроллерами представления.

  1. Сохраняйте данные на диске, если они не слишком сложные и большие, вы можете просто сохранить их в UserDefaults из вашего исходного контроллера представления, а затем получить доступ UserDefaults из двух других ваших контроллеров представления. Если данные более сложные, вам, возможно, придется использовать структуру базы данных (например, Realm или CoreData).
  2. Вы можете создавать статические свойства своих классов, если вам не нужно передавать данные конкретному экземпляру класса, к которому вы можете получить доступ со всех ваших контроллеров представления.
  3. Передайте данные, необходимые для обоих ваших контроллеров представления, через переход от вашего первого контроллера представления, а затем передайте данные, необходимые для вашего 3-го контроллера представления, когда вы переходите от второго. Однако это работает только с небольшим количеством контроллеров представления и только в том случае, если вы можете перейти к контроллеру представления только от того, на который вы отправляли данные ранее.

Изменить: пример использования статических свойств:

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.
    }
}
person Dávid Pásztor    schedule 29.06.2017
comment
не могли бы вы объяснить мне второй вариант ?? - person Bikesh Thakur; 29.06.2017
comment
Я обновил свой ответ простым примером. Также ознакомьтесь с свойствами типа если вы хотите узнать больше о втором варианте, который я упомянул. - person Dávid Pásztor; 29.06.2017
comment
я не понимаю, можете ли вы отредактировать весь мой код, чтобы я мог легко получить - person Bikesh Thakur; 29.06.2017
comment
Я использовал ваш 1-й вариант, потому что у меня нет сложных данных. Спасибо за хорошее предложение. Удачного кодирования !!! - person Bikesh Thakur; 29.06.2017