我正在处理一个包含“创建新帐户”视图控制器及其随附的名为“CreateNewAccount”的 Swift 类的项目。用户可以在这个视图控制器中放置 4 个输入值,名字、姓氏、用户名和密码。单击此 VC 中的“创建帐户”按钮后,4 个输入值将传递给一个名为 UserInfoRetrieveModel 的 Swift 类(我相信在 MVC 的模型层内),它们应该存储在那里。
然后我想将这些值传递给另一个名为 UserInfoModel 的 Swift 类(也是一个模型),然后它将第一个名称值委托给位于名为“ThanksForJoining”的 VC 中的 label 的文本值(及其随附的班级)。
我已经弄清楚如何将值从 VC 传递到模型(CreateNewAccount 到 UserInfoRetrieveModel)以及从模型到 VC(UserInfoModel 到ThanksForJoining),但是在我从模型到模型(UserInfoRetrieveModel 到 UserInfoModel)的转移中,最初输入到“CreateNewAccount, " 我想传递给第二个模型类 UserInfoModel 变为 nil。
下面是 CreateNewAccount、UserInfoRetrieve、UserInfo 和ThanksForJoining 的代码:
创建新帐户 ->
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.delegate = self
uInfoRetrieve.retrieving()
}
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)
}
}
用户信息检索 ->
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 Foundation
protocol UserInfoModelDelegate: class {
func didReceiveDataUpdate(data: String)
}
class UserInfoModel {
weak var delegate: UserInfoModelDelegate?
let uInfoRetrieve = UInfoRetrieveModel()
func requestData() -> Array<String> {
let firstName = uInfoRetrieve.firstName
let lastName = uInfoRetrieve.lastName
let userName = uInfoRetrieve.userName
let password = uInfoRetrieve.password
delegate?.didReceiveDataUpdate(data: firstName)
delegate?.didReceiveDataUpdate(data: lastName)
delegate?.didReceiveDataUpdate(data: userName)
delegate?.didReceiveDataUpdate(data: password)
let credentials = [firstName, lastName, userName, password] as [Any]
return credentials as! Array<String>
}
}
感谢加入 ->
import UIKit
class ThanksForJoining: UIViewController {
var userInfo = UserInfoModel()
@IBOutlet weak var firstName: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
userInfo.delegate = self
firstName.text = userInfo.requestData()[0]
print("yo")
print(userInfo.requestData()[0])
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ThanksForJoining: UserInfoModelDelegate {
func didReceiveDataUpdate(data: String) {
print(data)
}
}
UserInfoModel
并CreateNewAccount
同时创建UInfoRetrieveModel
. 您必须正确连接它们才能传递信息。
正确连接意味着(以最简单的形式)一个构建另一个并将自己设置为另一个的委托,因此UInfoRetrieveModel
可以传递数据。子模型的构建通常通过computed property
.
struct Account {
let firstName: String, lastName: String
let userName: String, password: String
}
extension UInfoRetrieveModelDelegate: class {
createAccount(_ account: Account): Bool
}
extension UserInfoModel: UInfoRetrieveModelDelegate{
func createAccount(_ account: Account) -> Bool {
// Handling creation of account.
return success == true
}
var newUInfoRetrieveModel: UInfoRetrieveModel {
let helperModel = UInfoRetrieveModel(parent: self)
helperModel.delegate = self
return helperModel
}
}
是的。您通常有一个Model
,您的数据,然后有一些东西可以控制对它的访问以对您的模型进行更改,管理模型的存储方式,也许与云服务同步,这就是ModelController
您在之间传递的内容ViewControllers
,更多/其他controllers
您通常使用 incase 使事情更简单。在您的情况下,您可能会将createAccount
(调用)传递给controller/viewController
负责告诉modelController
创建帐户然后告诉其中一个views/viewControllers
显示模态/任何内容的 a 。
将数据传递到更高级别的常用方法是让viewController/controller
一个它用来与更高级别通信的委托“负责ViewController/controller
自己无法完成的操作”,例如将数据向上推(创建调用,修改调用,删除调用)如果没有意义给它 amodelController
因为它不控制应用程序的那部分等。在你的情况下,你当然可以将 a 传递modelController
给每个 little viewController/view
,但通常更实用/更简单,只将它提供给一个控制部分,让其他人与当前控制部分进行通信controller/viewController
。
这里更详细的意思是你可能不想CreateAccountViewController
显示成功对话框,而是另一个,CreateAccountViewController
然后它可以自己不显示,因为它不再在堆栈上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句