在出现这个问题之前,我一直使用故事板和网点来处理文本字段。然而,我发现用编程的方式来处理我的应用程序更容易。 不幸的是,当我开始转换我的应用程序时,例如通过编程制作文本字段,我遇到了一些问题,因为我仍然有一些功能,例如我的登录功能,是为故事板的文本字段制作的。 我还是新的swift,所以任何解决方案都会有帮助。
我声明我的电子邮件文本字段是这样的。
var emailTxt: UITextField!
电子邮件文本字段的其他方面是这样的 在视图中做了加载功能。
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()
}
最后是我遇到问题的地方
首先,它说对于守护语句必须有一个 else 语句。
然后,它说(二进制操作符'!='不能应用于类型为'UITextField?'和'String'的操作数)然后在 else 语句中,它说(closure表达式未被使用)。
最后,在 auth 语句中,它给出了错误。无法将 "UITextField "类型的值转换为预期的参数类型 "String",同时对电子邮件下划线。
下面是这方面的代码。
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
}
你的错误是不言自明的,你正在尝试使用的是 UITextField
类型为 String
. 这里你需要使用的是 .hasText
的财产 UIKeyInput
该协议 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
它返回的是一个空字符串。
你缺少了 .text
财产。
guard let email = emailTxt.text, !email.isEmpty else {
// show alert
return
}
截至 iOS 10,它也可以简单地写成。
guard emailTxt.hasText else {
// show alert
return
}
归功于@LeoDabus指出了这一点。