UITextField 不会以编程方式转换为字符串或采用任何二进制运算符 Xcode

Posted

技术标签:

【中文标题】UITextField 不会以编程方式转换为字符串或采用任何二进制运算符 Xcode【英文标题】:UITextField Programmatically won't convert into string or take any binary operators Xcode 【发布时间】:2020-05-30 03:59:15 【问题描述】:

在遇到此问题之前,我使用情节提要和插座作为文本字段。但是,我发现以编程方式处理我的应用程序更容易。不幸的是,当我开始转换我的应用程序时,例如以编程方式创建一个文本字段,我遇到了一些问题,因为我仍然有一些功能,例如为故事板中的文本字段创建的登录功能。我还是新手,所以任何解决方案都会有所帮助。

我这样声明了我的电子邮件文本字段:

    var emailTxt: UITextField! 

email 文本字段的其他方面在 view did load 函数中是这样的:

    emailTxt = UITextField(frame: CGRect(x: 77.0, y: 306.0, width: 262, height: 34))
    emailTxt.backgroundColor = .white
    emailTxt.borderStyle = .roundedRect
    emailTxt.keyboardAppearance = .light
    emailTxt.keyboardType = .emailAddress
    emailTxt.placeholder = "Email"
    emailTxt.font = UIFont.systemFont(ofSize: 14.0)
    emailTxt.textColor = .systemGreen
    emailTxt.tintColor = .systemGreen
    emailTxt.delegate = self

    self.view.addSubview(emailTxt)

视图外的文本字段函数确实加载了:

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    textField.resignFirstResponder()

最后是我遇到问题的地方。

首先,它说对于guard语句必须有一个else语句。

然后它说(二进制运算符'!='不能应用于'UITextField?'和'String'类型的操作数)然后在else语句中它说(闭包表达式未使用)

最后,在 auth 语句中它给出了错误:Cannot convert value of type 'UITextField' to expected argument type 'String' while underlining the email

下面是代码:

    guard let email = emailTxt
    email != "",
    let password = passwordTxt
    password != ""
        else 
            AlertController.showAlert(self, title: "Missing Info", message: "Please fill out all fields")
            return

    

    Auth.auth().signIn(withEmail: email, password: password, completion: (user, error) in
        guard error == nil else 
            AlertController.showAlert(self, title: "Error", message: error!.localizedDescription)
            return
        

【问题讨论】:

【参考方案1】:

您的错误是不言自明的,您正在尝试将UITextField 类型用作String。这里你需要使用的是UIKeyInput 协议的.hasText 属性UITextField 符合。方法如下:

guard emailTxt.hasText,
passwordTxt.hasText
    else 
        AlertController.showAlert(self, title: "Missing Info", message: "Please fill out all fields")
        return

let email = emailTxt.text!
let password = passwordTxt.text!

您可以强制解开UITextField 的文本,因为它默认为空字符串""。即使它设置为nil,它也会返回一个空字符串。

【讨论】:

UITextField text 属性默认值为空字符串。它永远不会返回 nil UIKeyInput 有一个名为 hasText 的属性正好用于此目的 guard emailTxt.hasText developer.apple.com/documentation/uikit/uikeyinput/… 我想我在某处读过这篇文章,可以强制解开可选的.text。那为什么 text 属性仍然是可选的? 是的,您可以强制打开它。即使您将 nil 分配给 text 属性,它也会在此之后立即返回一个空字符串 "那为什么 text 属性仍然是可选的?"这允许您为其分配一个可选字符串,而无需打开它【参考方案2】:

您缺少.text 属性。

guard let email = emailTxt.text, !email.isEmpty else 
    // show alert
    return

iOS 10 开始,也可以简单地写成:

guard emailTxt.hasText else 
    // show alert
    return

感谢@LeoDabus 指出这一点

【讨论】:

UITextField 文本属性默认值为空字符串。它永远不会返回 nil @user12985516 UIKeyInput 有一个名为 hasText 的属性,恰好对应于 guard emailTxt.hasText developer.apple.com/documentation/uikit/uikeyinput/… @LeoDabus 我什至不知道该属性。我看到它是在ios10中添加的。谢谢你,因为我多年来一直是这样写的。

以上是关于UITextField 不会以编程方式转换为字符串或采用任何二进制运算符 Xcode的主要内容,如果未能解决你的问题,请参考以下文章

iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置

以编程方式调整 UITextField 的大小会自动恢复为旧大小

UITableViewCell 中的 UITextField - 当它出现在屏幕上时,以编程方式使其成为 firstResponder?

将值从选择器视图设置为文本字段,而无需以编程方式全局快速声明 uitextfield

UITableView 单元格中的 UITextField 以编程方式成为FirstResponder

如何以编程方式选择 UITextField 进行编辑