代表仍然是零

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代表仍然是零相关的知识,希望对你有一定的参考价值。

我将用户数据从名为CreateNewAccount的视图控制器传递到另一个名为ThanksForJoining的视图控制器。出于某种原因,我的代表是nil。我使用segue将vc.delegate设置为self= self),segue标识符“thanksForJoining”指的是在故事板上连接CreateNewAccountThanksForJoining的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

ViewControllersConnected

  • segue的标识符正确设置为thanksForJoining(注意字母大小写。)

ConnectingSegue

如果两者中的任何一个都不正确,那么你已经失去了一点时间,我已经没有时间准备一场大型台风。更新你的问题,以澄清正在发生的事情,并等待有人帮助你......


假设有两件事,在源视图控制器上调用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

enter image description here

然后转到属性检查器并在“标识符”字段中设置ID“thanksForJoining”

enter image description here

一些建议

如果您打算在发回数据之前检查用户是否输入了所有字段,那么此代码将更好地用于此目的

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

以上是关于代表仍然是零的主要内容,如果未能解决你的问题,请参考以下文章

Android片段中的问题:仍然单击上一个片段

添加片段后,前一个片段仍然可见

替换的片段在背景上仍然可见

替换的片段仍然可见

以下代码片段 C++ 的说明

如何向 ViewPager 提供许多片段并避免错误代码?