【问题标题】:Firebase Auth Creating new user with text input from a different classFirebase Auth 使用来自不同类的文本输入创建新用户
【发布时间】:2017-12-07 22:51:41
【问题描述】:

我有两个视图控制器,第一个视图控制器包含来自用户的(电子邮件/用户名)输入的文本字段。第二个视图控制器包含来自用户的(密码)输入的文本字段。第二个视图控制器还包含一个 Button 来执行 FireBase Auth 代码以创建新用户。我想从第一个视图控制器类中获取电子邮件文本并将该数据传输到第二个视图控制器类,以便成功创建一个新用户。我尝试使用全局变量,但它似乎不起作用,对这个困境有什么帮助吗?感谢任何帮助!

【问题讨论】:

  • 请不要将代码发布为图片。将代码作为代码发布。
  • 好的,谢谢@dwilliss
  • 如果有的话,您不应该将全局变量用于电子邮件地址等用户敏感信息。至少,您可以考虑对带有私有变量的两个文本字段使用相同的 viewController,或者使用 prepareForSegue() 在 vi​​ewController 之间传递数据。请在他们的应用中完成用户验证的其他人提供比我建议的更好的策略...

标签: ios swift firebase firebase-authentication


【解决方案1】:

我不建议在这种情况下使用全局结构,但如果你想这样做。您可以创建一个新的 swift 文件并将您的结构移到该文件中。像这样:

struct GlobalData {
    var email: String? = nil
}

var globalData = GlobalData()

您可以使用globalData.email 获取该结构中的任何值

但是,我认为在 segue 时传递数据更有意义。如果您不知道如何进行转场,请查看this question。然后你可以这样做:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "nameOfYourSegue" {
            let controller = segue.destination as! NameOfViewControllerYourGoingTo
            controller.email = email
        }

您可以查看thisthisthis 了解更多信息。如果您仍有疑问,请告诉我。

【讨论】:

    【解决方案2】:

    全局变量,虽然不是解决这个问题的最佳方法,但如果你正确地使用它可以工作:

    1 声明一个全局变量,它应该在两个类之外(不要使用结构):

    var emailOrUsername: String = ""
    

    2 实现textFieldDidEndEditing方法(假设你已经将文本域delegate设置为self),并将文本域中的字符串赋值给emailOrUsername

    func textFieldDidEndEditing(_ textField: UITextField) {
        emailOrUsername = emailTextField.text
    }
    

    3 导航到下一个视图控制器后,只需引用该变量即可。很简单。

    编辑:虽然这种方法看起来很简单,但是当你的应用程序逐渐变得越来越复杂时,它会很难维护。所以,我建议你看看我对this question的回答(概念是一样的:协议)。

    您可以使用的另一种方法是在第二个视图控制器中定义 emailOrUsername 变量,然后在您的 prepareForSegue 中:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let secondViewController = segue.destination as? SecondViewController {
            secondViewController.emailOrUsername = emailTextField.text!
        }
    }
    

    【讨论】:

    • 当我尝试引用变量时,在 Firebase Auth 部分中出现“条件绑定的初始化程序必须具有可选类型,而不是“字符串”错误。
    • @DontWorry 不要在 if 语句中引用变量,因为我的答案使用类型 String,而不是 String?。如果您想使用String? 类型的变量并在if 语句中引用它,那么只需更改类型即可。没关系。
    • 参考@Louis Leung 所说的我可能不应该使用敏感数据,例如附加到全局变量的电子邮件。我将尝试 prepareforSegue
    • @DontWorry 好的,听起来不错。您不必使用全局变量。
    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2023-01-29
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多