如何将 JSON 数据从登录视图传递到多视图控制器,是否可能?
how to pass JSON data from login view to multiple view controller, is it possible or not?
我正在尝试使用 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,尝试在两个视图控制器中传递数据,如何解决这个问题?或者需要一些建议?
由于您只能连接到一个控制器,因此您不能直接将数据传递给 prepare(for segue)
中的多个 ViewController
。
但是,您可以使用多种方法在多个视图控制器之间传递数据。
- 将数据保存在磁盘上,如果它不是太复杂和太大,你可以从你的初始视图控制器将它存储在
UserDefaults
中,然后从你的其他两个视图控制器访问 UserDefaults
.如果数据比较复杂,您可能需要使用数据库框架(例如 Realm 或 CoreData)。
- 如果您不需要将数据传递给特定的 class 实例,您可以创建 classes 的静态属性,您可以从所有视图控制器访问该实例。
- 从第一个视图控制器通过 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.
}
}
我正在尝试使用 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,尝试在两个视图控制器中传递数据,如何解决这个问题?或者需要一些建议?
由于您只能连接到一个控制器,因此您不能直接将数据传递给 prepare(for segue)
中的多个 ViewController
。
但是,您可以使用多种方法在多个视图控制器之间传递数据。
- 将数据保存在磁盘上,如果它不是太复杂和太大,你可以从你的初始视图控制器将它存储在
UserDefaults
中,然后从你的其他两个视图控制器访问UserDefaults
.如果数据比较复杂,您可能需要使用数据库框架(例如 Realm 或 CoreData)。 - 如果您不需要将数据传递给特定的 class 实例,您可以创建 classes 的静态属性,您可以从所有视图控制器访问该实例。
- 从第一个视图控制器通过 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.
}
}