读取 UITextfields 的值时出错

Posted

技术标签:

【中文标题】读取 UITextfields 的值时出错【英文标题】:Error in reading values of UITextfields 【发布时间】:2018-03-21 13:19:50 【问题描述】:

我无法从文本字段中读取值。每次我在此行中输入 let username = UsernameTextField.text 时都会收到一条错误消息:“无法在属性初始化程序中使用实例成员 'UsernameTextField';属性初始化程序在 'self' 可用之前运行”。

这里是完整的代码:

import UIKit

class SignInViewController: UIViewController,UITextFieldDelegate 
    @IBOutlet var UsernameTextField: UITextField!
    @IBOutlet var PasswordTextField: UITextField!
    @IBOutlet var LogInButton: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.isTranslucent = true
        navigationController?.view.backgroundColor = UIColor.clear
        // Remove Autocorrection Type
        UsernameTextField.autocorrectionType = .no
        PasswordTextField.autocorrectionType = .no
        PasswordTextField.textContentType = UITextContentType("")
        //Next button takes user to the next textfield
        UsernameTextField.delegate = self
        PasswordTextField.delegate = self
    

    func textFieldShouldReturn(_ textField: UITextField) -> Bool 
        if textField == UsernameTextField
            PasswordTextField.becomeFirstResponder()

         else if textField == PasswordTextField 
            self.view.endEditing(true)
        
        return true
    

    let username = UsernameTextField.text

【问题讨论】:

因为那行“丢失”了,它“无处”不在方法中? 不在方法中是什么意思? 这行代码在方法大括号之外,但在类大括号内 它需要在一个方法(或函数)内部,而不是在类中独立 【参考方案1】:

这就是你所拥有的,设置文本的调用不在函数中。

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    if textField == UsernameTextField
        PasswordTextField.becomeFirstResponder()

     else if textField == PasswordTextField 
        self.view.endEditing(true)
    
    return true


let username = UsernameTextField.text // THIS IS NOT IN A FUNCTION

把它移到这里:

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    if textField == UsernameTextField
        PasswordTextField.becomeFirstResponder()
     else if textField == PasswordTextField 
        self.view.endEditing(true)
    
    let username = UsernameTextField.text // THIS IS NOW IN A FUNCTION    
    return true

【讨论】:

【参考方案2】:

您是否有一个名为UsernameTextFieldUITextField 子类? 如果是这样,它可能是引用类而不是实例。

我建议将变量的名称保留为驼峰式。更容易区分变量和类。

如果这是您使用的约定,您也可以尝试使用

let name = self.UsernameTextField.text

编辑:

这行似乎超出了函数范围。 应该在关闭之前移动它。

【讨论】:

【参考方案3】:

线

let username = UsernameTextField.text

在你的类定义的范围内,而不是在方法的范围内。因此,这构成了在构造类实例时运行的属性初始化。您正在尝试使用另一个成员变量 (UsernameTextField) 来初始化成员变量用户名。这当然是行不通的,因为必须先完全初始化对象,然后才能读取任何成员。

您的意思是将该行放在 textFieldShouldReturn 方法的范围内吗?

【讨论】:

【参考方案4】:

正如错误所暗示的那样,“UsernameTextField”是一个实例成员,这意味着它在类被实例化(与静态成员相反)之前不会被实例化,这意味着当你的行被编译时,在类被实例化之前,该成员还不存在。

【讨论】:

【参考方案5】:

你必须移动你的常量并将它们放在“return true”下

【讨论】:

以上是关于读取 UITextfields 的值时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试处理 /view/ajax 时出错:无法读取未定义的属性“长度”

Flutter:显示单个列表值时出错

Cloud Functions for Firebase - 序列化返回值时出错:

Swift 计算 UITextFields 的值并返回值

javascript 解析引擎在读取一个object的属性的值时,会沿着 2 向上寻找,如果最终没

如何删除 - 从右到左读取字符串值时