代表仍然是零
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代表仍然是零相关的知识,希望对你有一定的参考价值。
我将用户数据从名为CreateNewAccount
的视图控制器传递到另一个名为ThanksForJoining
的视图控制器。出于某种原因,我的代表是nil
。我使用segue将vc.delegate
设置为self
(= self
),segue标识符“thanksForJoining”指的是在故事板上连接CreateNewAccount
和ThanksForJoining
的segue。但不知何故,代表仍然是nil
。
建立新帐户:
import UIKit
protocol UserInfoDelegate {
func sendUserInfo(firstName: String, lastName: String, username: String, password: String)
}
class CreateNewAccount: UIViewController{
@IBOutlet weak var FNInput: UITextField!
@IBOutlet weak var LNInput: UITextField!
@IBOutlet weak var usernameInput: UITextField!
@IBOutlet weak var passwordInput: UITextField!
var infoDelegate: UserInfoDelegate?
@IBAction func sendInfo(_ sender: Any) {
if(infoDelegate != nil){
if(FNInput.text != nil && LNInput.text != nil && usernameInput.text != nil && passwordInput.text != nil){
let firstName = FNInput.text
let lastName = LNInput.text
let username = usernameInput.text
let password = passwordInput.text
infoDelegate?.sendUserInfo(firstName: firstName!, lastName: lastName!, username: username!, password: password!)
}
}
}
}
ThanksforJoining:
import UIKit
class ThanksForJoining: UIViewController, UserInfoDelegate {
@IBOutlet weak var fName: UILabel!
func sendUserInfo(firstName: String, lastName: String, username: String, password: String) {
print(firstName)
fName.text = firstName
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "thanksForJoining") {
let createNewAccount: CreateNewAccount = segue.destination as! CreateNewAccount
createNewAccount.infoDelegate = self
}
}
}
首先,您需要确认:
- 你通过segue将
CreateNewAccount
连接到ThanksForJoining
。
- segue的标识符正确设置为
thanksForJoining
(注意字母大小写。)
如果两者中的任何一个都不正确,那么你已经失去了一点时间,我已经没有时间准备一场大型台风。更新你的问题,以澄清正在发生的事情,并等待有人帮助你......
假设有两件事,在源视图控制器上调用prepare(for:sender:)
。您需要在CreateNewAccount
类中实现它。
建立新帐户:
import UIKit
class CreateNewAccount: UIViewController {
@IBOutlet weak var firstNameInput: UITextField!
@IBOutlet weak var lastNameInput: UITextField!
@IBOutlet weak var usernameInput: UITextField!
@IBOutlet weak var passwordInput: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "thanksForJoining" {
let destinationVC = segue.destination as! ThanksForJoining
if
let firstName = firstNameInput.text, !firstName.isEmpty,
let lastName = lastNameInput.text, !lastName.isEmpty,
let username = usernameInput.text, !username.isEmpty,
let password = passwordInput.text, !password.isEmpty
{
destinationVC.receiveUserInfo(firstName: firstName, lastName: lastName, username: username, password: password)
}
}
}
}
ThanksForJoining:
import UIKit
class ThanksForJoining: UIViewController {
var firstName: String?
@IBOutlet weak var firstNameLabel: UILabel!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
firstNameLabel.text = firstName
}
func receiveUserInfo(firstName: String, lastName: String, username: String, password: String) {
print(firstName)
self.firstName = firstName
}
}
似乎委托模式对于您的目的来说太多了,您只需要在目标视图控制器ThanksForJoining
中定义数据传递方法。
我假设你已经从CreateNewAccount
的某个按钮连接了你的segue。如果segue是从视图控制器(而不是按钮)连接的,则上面的代码需要进行少量修改。
但无论如何,在你的原始代码中,prepare(for:sender:)
中的方法ThanksForJoining
将永远不会被调用,因此代理将永远不会被设置。因此,代表仍然是nil
。
首先,您需要在类ThankForJoining类中引用CreateNewAccount类。然后,您需要通过在viewDidLoad中的ThanksForJoing类中将其设置为self来激活委托。
class ThanksForJoining: UIViewController, UserInfoDelegate {
var createNewAccount: CreateNewAccount?
override func viewDidLoad() {
super.viewDidLoad()
createNewAccount?.infoDelegate = self
}
{
然后您的委托方法将起作用。
唯一可能的问题是代码和故事板中的segue标识符不匹配
在故事板中,选择两个VC之间的segue
然后转到属性检查器并在“标识符”字段中设置ID“thanksForJoining”
一些建议
如果您打算在发回数据之前检查用户是否输入了所有字段,那么此代码将更好地用于此目的
if (infoDelegate != nil) {
if let firstName = FNInput.text, firstName.count>0,
let lastName = LNInput.text, lastName.count>0,
let username = usernameInput.text, username.count>0,
let password = passwordInput.text, password.count>0 {
infoDelegate?.sendUserInfo(firstName: firstName, lastName: lastName, username: username, password: password)
}
}
以上是关于代表仍然是零的主要内容,如果未能解决你的问题,请参考以下文章