如何将数组值从 ViewController 的协议传递到另一个 ViewController
How to pass array values from Protocol of a ViewController to another ViewController
说明我想做什么:
- 我想创建一个 let params : [String: AnyObject] Array/Dic 包含 [ name
: nameTextField.text, pass : passTextField.text, 等等... ] 合二为一
ViewController 叫 "SignUpVC"
也在 "SignUpVC" 我想要一个协议来保存我的值
params 和“保存”它们供以后在其他 ViewController 中使用。不使用 NSUserDefaults.
现在那些 params 被保存并分配给 协议
函数的参数,我想进入另一个ViewController
“SchoolSelectionVC”并调出这些值并分配
params 到 var newParams : [String : AnyObject] 所以它们等于相同的东西但是如果
我想...
所以基本上,我试图用来自 SignUpVC 的用户输入分配一些值,保存这些值,并将它们带到另一个 ViewController 中的另一个变量以供进一步使用或更改.
问题:
下面是我的代码,它表明我正在创建一个 SignUpVC 协议,一个名为“var signupDelegate = SignUpVCProtocol",一个let param,给它赋值,试图把let param赋给SignUpVC Protocol parameters,然后移入另一个ViewController(SchoolSelectionVC"),但是报错停在那里。这一切都发生在 SignUpVC.
中的按钮单击操作中
我只是想知道为什么当我尝试将参数传递给它时,持有 SignUpVC 协议及其函数的委托变量给我一个错误。
如果有任何关于如何将值从一个 VC 保存到另一个的提示,请告诉我,如果我的任何代码需要更多解释,也请告诉我!
代码:
protocol SignUpVCProtocol {
func logInData(params : [String : AnyObject])
}
class SignUpVC: UIViewController{
//MARK:- @IBOutlet
//MARK: ^^^^^^^^^^^^^^^^^^^^
@IBOutlet var signUpWithFacebookButton: UIButton!
//MARK:- Properties
//MARK: ^^^^^^^^^^^^^^^^^^^^
var selectedTextField : UITextField!
var keyboardPresent = false
var loginFlag = false
var fbId: String!
var picUrl: String!
var schoolID : String = ""
var schoolDict : [String:AnyObject]!
var player: AVPlayer?
var fbData : AnyObject!
let domainLbl = UILabel()
var signUpDelegate : SignUpVCProtocol! //Delegate var for Protocol
在按钮操作中:
let params = [
"Action" : "signUp" as AnyObject,
"name" : self.nameTextField.text! as AnyObject,
"email" : "\(self.emailTextField.text!)" as AnyObject,
"password" : self.passwordTextField.text! as AnyObject,
"school" : self.schoolTextField.text! as AnyObject,
"device_token" : sharedAppdelegate.DeviceToken as AnyObject,
"device_type" : "iphone" as AnyObject,
"school_id" : self.schoolID as AnyObject
]
self.signUpDelegate.logInData(params: params) //!!Where i want to assign the above params to the protocol params for use in SchoolSelectionVC
//ERROR HAPPENS RIGHT ABOVE^^
let schoolVC = self.storyboard?.instantiateViewController(withIdentifier: "SchoolSelectionVC") as! SchoolSelectionVC
let navVC = UINavigationController(rootViewController: schoolVC)
navVC.isNavigationBarHidden = true
schoolVC.delegate = self
self.present(navVC, animated: true, completion: nil)
//in another VC Class
extension SchoolSelectionVC: SignUpVCProtocol
{
func logInData(params: [String : AnyObject]) {
self.newParams = params as! [String : String]
}
}
不要使用协议在 viewController 之间传递数据,使用
func prepare(for segue: UIStoryboardSegue, sender: Any?)
相反。
检查这个答案:
对于需要以编程方式加载的视图控制器,您可以使用这个传递数据的示例:
//For using without navigation controller
let vc = SomeViewController(nibName: "SomeViewController", bundle: nil);
vc.someVariable = someData
self.present(vc, animated: true, completion: nil)
//For using with navigation controller
let vc = SomeViewController(nibName: "SoveViewController", bundle: nil);
vc.someVariable = someData
self.navigationController?.pushViewController(vc, animated: true)
说明我想做什么:
- 我想创建一个 let params : [String: AnyObject] Array/Dic 包含 [ name : nameTextField.text, pass : passTextField.text, 等等... ] 合二为一 ViewController 叫 "SignUpVC"
也在 "SignUpVC" 我想要一个协议来保存我的值 params 和“保存”它们供以后在其他 ViewController 中使用。不使用 NSUserDefaults.
现在那些 params 被保存并分配给 协议 函数的参数,我想进入另一个ViewController “SchoolSelectionVC”并调出这些值并分配 params 到 var newParams : [String : AnyObject] 所以它们等于相同的东西但是如果 我想...
所以基本上,我试图用来自 SignUpVC 的用户输入分配一些值,保存这些值,并将它们带到另一个 ViewController 中的另一个变量以供进一步使用或更改.
问题:
下面是我的代码,它表明我正在创建一个 SignUpVC 协议,一个名为“var signupDelegate = SignUpVCProtocol",一个let param,给它赋值,试图把let param赋给SignUpVC Protocol parameters,然后移入另一个ViewController(SchoolSelectionVC"),但是报错停在那里。这一切都发生在 SignUpVC.
中的按钮单击操作中我只是想知道为什么当我尝试将参数传递给它时,持有 SignUpVC 协议及其函数的委托变量给我一个错误。
如果有任何关于如何将值从一个 VC 保存到另一个的提示,请告诉我,如果我的任何代码需要更多解释,也请告诉我!
代码:
protocol SignUpVCProtocol {
func logInData(params : [String : AnyObject])
}
class SignUpVC: UIViewController{
//MARK:- @IBOutlet
//MARK: ^^^^^^^^^^^^^^^^^^^^
@IBOutlet var signUpWithFacebookButton: UIButton!
//MARK:- Properties
//MARK: ^^^^^^^^^^^^^^^^^^^^
var selectedTextField : UITextField!
var keyboardPresent = false
var loginFlag = false
var fbId: String!
var picUrl: String!
var schoolID : String = ""
var schoolDict : [String:AnyObject]!
var player: AVPlayer?
var fbData : AnyObject!
let domainLbl = UILabel()
var signUpDelegate : SignUpVCProtocol! //Delegate var for Protocol
在按钮操作中:
let params = [
"Action" : "signUp" as AnyObject,
"name" : self.nameTextField.text! as AnyObject,
"email" : "\(self.emailTextField.text!)" as AnyObject,
"password" : self.passwordTextField.text! as AnyObject,
"school" : self.schoolTextField.text! as AnyObject,
"device_token" : sharedAppdelegate.DeviceToken as AnyObject,
"device_type" : "iphone" as AnyObject,
"school_id" : self.schoolID as AnyObject
]
self.signUpDelegate.logInData(params: params) //!!Where i want to assign the above params to the protocol params for use in SchoolSelectionVC
//ERROR HAPPENS RIGHT ABOVE^^
let schoolVC = self.storyboard?.instantiateViewController(withIdentifier: "SchoolSelectionVC") as! SchoolSelectionVC
let navVC = UINavigationController(rootViewController: schoolVC)
navVC.isNavigationBarHidden = true
schoolVC.delegate = self
self.present(navVC, animated: true, completion: nil)
//in another VC Class
extension SchoolSelectionVC: SignUpVCProtocol
{
func logInData(params: [String : AnyObject]) {
self.newParams = params as! [String : String]
}
}
不要使用协议在 viewController 之间传递数据,使用
func prepare(for segue: UIStoryboardSegue, sender: Any?)
相反。
检查这个答案:
对于需要以编程方式加载的视图控制器,您可以使用这个传递数据的示例:
//For using without navigation controller
let vc = SomeViewController(nibName: "SomeViewController", bundle: nil);
vc.someVariable = someData
self.present(vc, animated: true, completion: nil)
//For using with navigation controller
let vc = SomeViewController(nibName: "SoveViewController", bundle: nil);
vc.someVariable = someData
self.navigationController?.pushViewController(vc, animated: true)