【问题标题】:How to pass data from a view controller to a model?如何将数据从视图控制器传递到模型?
【发布时间】:2018-08-20 18:31:56
【问题描述】:

我目前正在处理一个项目,该项目有一个创建帐户页面,该页面由一个名为 CreateNewAccount 的视图控制器和一个伴随它的同名类表示。有四个值被输入到这个视图控制器中:1)名字,2)姓氏,3)用户名,和 4)密码。此视图控制器还有一个“创建帐户”按钮,当按下该按钮时,应将在 4 个输入中输入的字符串值传输到一个名为 UInfoRetrieveModel 的新类,该类将在 MVC 配置下归类为模型。不幸的是,这个价值转移部分不起作用。

然后我让 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)
  }
}

创建新帐户->

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

【问题讨论】:

  • 您需要告诉我们正在发生的事情以及应该发生的事情。 Edit您的问题及相关细节。
  • 如果thanksForJoining 是通过按下按钮调用的,那么uInfoRetrieve 应该包含按下它之后的值。您没有看到任何打印,因为据我所知,没有人调用 retrieving()。
  • @rmaddy 我编辑了我对问题的解释
  • @ErikZivkovic 我尝试添加 retrieving() ,但我仍然没有得到数据传输
  • @ErikZivkovic 我无法给它+1,因为我的“声誉”低于 15,但我刚刚批准了它。谢谢。

标签: swift xcode model-view-controller


【解决方案1】:

您呼叫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,你不会得到回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2010-11-25
    • 2013-07-08
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多