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
,它也会返回一个空字符串。
【讨论】:
UITextFieldtext
属性默认值为空字符串。它永远不会返回 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 @user12985516UIKeyInput
有一个名为 hasText 的属性,恰好对应于 guard emailTxt.hasText
developer.apple.com/documentation/uikit/uikeyinput/…
@LeoDabus 我什至不知道该属性。我看到它是在ios10中添加的。谢谢你,因为我多年来一直是这样写的。以上是关于UITextField 不会以编程方式转换为字符串或采用任何二进制运算符 Xcode的主要内容,如果未能解决你的问题,请参考以下文章
iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置
以编程方式调整 UITextField 的大小会自动恢复为旧大小
UITableViewCell 中的 UITextField - 当它出现在屏幕上时,以编程方式使其成为 firstResponder?
将值从选择器视图设置为文本字段,而无需以编程方式全局快速声明 uitextfield