如何将数据从视图控制器传递到模型?

时间:2018-08-20 18:31:57

标签: swift xcode model-view-controller

我目前正在一个项目中,该项目具有一个由称为CreateNewAccount的视图控制器表示的“创建帐户”页面以及一个与之同名的类。此视图控制器中输入了四个值:1)firstName,2)lastName,3)用户名和4)密码。该视图控制器还具有一个“创建帐户”按钮,当按下该按钮时,应将在4个输入中输入的字符串值传输到名为UInfoRetrieveModel的新类,该类将在MVC配置下归类为Model。不幸的是,该价值转移部分无法正常工作。

然后我让UInfoRetrieveModel将这4个值直接传递给另一个名为UserInfo的模型,然后将这些值中的任何一个委派给UI端可能需要显示它们的其他视图控制器。我已经弄清楚了如何将值从UInfoRetrieveModel传递给UserInfo以及从UserInfo(这是一个模型)传递给所说的视图控制器,但是我还没有弄清楚如何从视图控制器(特别是CreateNewAccount)传递给模型,在这种情况下是UInfoRetrieveModel。

基本上,我在这里的想法是拥有两个模型类:一个模型接收(UInfoRetrieveModel),另一个模型委托(UserInfo)CreateNewAccount中设置的数据值,以使跨UI的数据传输更加有效。

下面是我的CreateNewAccount和UInfoRetrieveModel代码,其中转移似乎无效:

UInfoRetrieveModel->

import Foundation

protocol UInfoRetrieveModelDelegate: class {
     func credentialTransfer(data:String)
}

class UInfoRetrieveModel: NSObject {

weak var delegate: UInfoRetrieveModelDelegate?

var firstName: String = ""
var lastName: String = ""
var userName: String = ""
var password: String = ""

func retrieving(){

    delegate?.credentialTransfer(data: firstName)
    delegate?.credentialTransfer(data: lastName)
    delegate?.credentialTransfer(data: userName)
    delegate?.credentialTransfer(data: password)
  }
}

CreateNewAccount->

import UIKit

class CreateNewAccount: UIViewController{

@IBOutlet weak var FNInput: UITextField!
@IBOutlet weak var LNInput: UITextField!
@IBOutlet weak var usernameInput: UITextField!
@IBOutlet weak var passwordInput: UITextField!

var uInfoRetrieve = UInfoRetrieveModel()

@IBAction func thanksForJoining(_ sender: Any) {
    uInfoRetrieve.firstName = FNInput.text!
    uInfoRetrieve.lastName = LNInput.text!
    uInfoRetrieve.userName = usernameInput.text!
    uInfoRetrieve.password = passwordInput.text!
    uInfoRetrieve.retrieving()        
    uInfoRetrieve.delegate = self
}
override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
 }

extension CreateNewAccount: UInfoRetrieveModelDelegate{
   func credentialTransfer(data: String) {
      print(data)
   }
 }

1 个答案:

答案 0 :(得分:0)

您以错误的顺序致电retrieving()。请改用以下顺序:

@IBAction func thanksForJoining(_ sender: Any) {
    uInfoRetrieve.firstName = FNInput.text!
    uInfoRetrieve.lastName = LNInput.text!
    uInfoRetrieve.userName = usernameInput.text!
    uInfoRetrieve.password = passwordInput.text!
    uInfoRetrieve.delegate = self
    uInfoRetrieve.retrieving()        
}

原因:如果您在设置委托之前调用retreiving(),则委托将为nil,并且您不会获得回调。