如何将数组值从 ViewController 的协议传递到另一个 ViewController

Posted

技术标签:

【中文标题】如何将数组值从 ViewController 的协议传递到另一个 ViewController【英文标题】:How to pass array values from Protocol of a ViewController to another ViewController 【发布时间】:2017-10-31 01:48:26 【问题描述】:

说明我想做什么:

我想创建一个 let params : [String: AnyObject] 包含 [ 名称的数组/Dic :nameTextField.text,pass:passTextField.text等...]合二为一 ViewController 称为 "SignUpVC"

也在 "SignUpVC" 内部我想要一个协议来保存我的值 params 和“save”它们以供以后在其他 ViewControllers 中使用。不使用 NSUserDefaults。

现在这些 params 被保存并分配给 协议的 函数的参数,我想进入另一个名为 “SchoolSelectionVC”并调出这些值并分配 paramsvar newParams : [String : AnyObject] 因此它们相等,但如果出现以下情况,则无法更改某些值 我想...

所以基本上,我正在尝试使用来自 SignUpVC 的用户输入来分配一些值,保存这些值,并将它们带到另一个 ViewController 中的另一个变量以供进一步使用或更改。

问题:

下面是我的代码,它表明我正在创建一个 SignUpVC 协议,一个名为“var signupDelegate = SignUpVCProtocol”的委托,一个 let 参数,为其赋值,尝试将 let 参数 分配给 SignUpVC 协议参数,然后移动到另一个 ViewController ("SchoolSelectionVC" ),但错误将其停在那里。这一切都发生在 SignUpVC 内的按钮单击操作中。

我只想知道为什么当我尝试将参数传递给它时,持有 SignUpVCProtocol 及其函数的委托变量会给我一个错误。

如果有任何关于如何将值从一个 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]
        
    

【问题讨论】:

【参考方案1】:

不要使用协议在viewControllers之间传递数据,使用

func prepare(for segue: UIStoryboardSegue, sender: Any?)

改为。

检查这个答案: Passing object with prepareForSegue Swift

对于需要以编程方式加载的视图控制器,可以使用以下传递数据的示例:

//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)

【讨论】:

谢谢你!我不得不用这个应用程序中的事物转换方式替换很多功能,但我仍然让它成为可能并且工作也一样,似乎以编程方式加载视图控制器不会在事情变得混乱时为功能留下太多空间,但这种方式是快速覆盖方法并完成!再次感谢。 @amirkrd,你错了。将数据传递给将以编程方式加载的 viewController 比将数据传递给 viewController 更容易,后者将使用“performSegue”加载。我已经更新了答案。你只需要初始化viewController,然后你就可以访问你需要的变量了。

以上是关于如何将数组值从 ViewController 的协议传递到另一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 ViewController 传递到选项卡栏,然后将 Tabor 传递到 ViewController 到选项卡栏中的第一个选定项目

如何将 JSON 值从一个 ViewController 传递到另一个

如何将值从 SceneDelegate 文件传输到 ViewController (Swift 5)

如何将 CoreLocation 值从一个 VIewController 传递到 iOS 中的 AppDelegate?

在 SWIFT 语言的 Storyboard 中将值从一个 ViewController 传递到另一个 ViewController

如何将值从 listObjects 推送到数组