Ios 如何知道Swift中的文本字段是否为空?
我正在swift中创建一个基础应用程序(用于学习目的),以便将猫年转换为人类年。因此,有一个名为:edadGatoTextField的文本框,用户可以在其中输入猫的年份,然后按calcularEdadButtonPressed按钮查看在mensajeLabel中转换的年份 我试图添加一个if语句,以便在mensajeLabel中打印一条消息,告诉用户必须输入一个数字才能转换它 -->下面是代码,它应该可以工作,但是为什么我在:if age?Ios 如何知道Swift中的文本字段是否为空?,ios,swift,Ios,Swift,我正在swift中创建一个基础应用程序(用于学习目的),以便将猫年转换为人类年。因此,有一个名为:edadGatoTextField的文本框,用户可以在其中输入猫的年份,然后按calcularEdadButtonPressed按钮查看在mensajeLabel中转换的年份 我试图添加一个if语句,以便在mensajeLabel中打印一条消息,告诉用户必须输入一个数字才能转换它 -->下面是代码,它应该可以工作,但是为什么我在:if age? self.yourTextField.add
self.yourTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
我正常运行我的应用程序,但当按下CalcularedDataButton按钮时,当edadGatoTextField中没有数字时,应用程序崩溃
有一些东西与期权或未包装的期权有关
class ViewController: UIViewController {
@IBOutlet weak var edadGatoTextField: UITextField!
@IBOutlet weak var mensajeLabel: UILabel!
@IBOutlet weak var imagenGatoImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func calcularEdadButtonPressed(sender: AnyObject) {
var age = edadGatoTextField.text.toInt()
// *** Bellow is the error! I'm trying to figure out if user
// has not entered any number in order to display the message.
if age {
age = age * 7
mensajeLabel.text = "Your cat's age is \(age) years!"
mensajeLabel.textColor = UIColor.blueColor()
edadGatoTextField.resignFirstResponder()
imagenGatoImageView.image = UIImage(named: "cat2.jpg")
} else {
mensajeLabel.text = "Please enter a number!"
mensajeLabel.textColor = UIColor.redColor()
}
}
}
age
的类型为Int?
(可选的Int
),因此是整数或nil
。不能将nil
比较视为Swiftif
语句中的布尔比较。必须明确检查nil
:
if age != nil {
let humanAge = age! * 7
//...
} else {
//...
}
但您可能应该改用可选绑定,除非您有理由不:
if let age = edadGatoTextField.text.toInt() {
let humanAge = age * 7
//...
} else {
//...
}
如果查看docs UITextField.text,它是一个隐式展开的可选项,因此如果未初始化,它可能为零。由于“if let”和可选的链接构造,当且仅当文本不是nil并且可转换为int时,您将获得“age”,否则它将为nil 这里有两个问题 首先,
UITextField
的text
属性是可选的。除非每次创建时都手动将其设置为空字符串,否则在用户键入内容之前,它将为nil
其次,String
的toInt()
方法返回可选的Int?
。如果调用的toInt()
字符串不能被解析为整数,toInt()
返回nil
还有斯图尔特的答案遇到的障碍。使用if-let
模式,我们必须在if
主体内声明另一个变量乘以7,因为if-let
声明了一个不能修改的常量
然而,我们可以在一条线上解决所有这三个问题。我们只需要知道,if let
不是唯一可用的模式。如果var,我们可以使用:
if var catAge = edadGatoTextField.text.toInt() {
catAge *= 7
// the rest of what you need to do
}
Swift 3
您可以通过此代码检查文本字段是否为空?
将目标添加到文本字段中
self.yourTextField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
现在,您可以绑定与目标字段关联的函数。
如果是年龄!=nil{}将在第age=age*7行给出错误。我认为最好的方法是在您的答案中添加代码片段。如果让age=edadGatoTextField.text.toInt()
也会在age=age*7
行给出错误,因为age
将是一个常量。我假设他们自己能够重构if
语句的内容,但我将编辑我的答案以澄清。@Stuart我尝试了这两种方法,它们都很好地工作。感谢您的精彩解释。我甚至不知道if var
statement@nhgrif很好,我也不知道您可以在可选绑定中使用var
(我知道这在函数声明中是可能的,但我不记得文档中提到过if
)。一个小建议:您正在使用类似CalcularedAbuttonPressed()的方法名。选择一种语言并坚持使用它,而不是将它们混合使用,这可能是有用的。所以calculateAgeButtonPressed()。如果你把它们结合起来,你一定会在某个时候感到困惑。就个人而言,我只喜欢使用英语,因为编程语言本身也是英语(.text、.textColor等),堆栈溢出上的每个人在粘贴示例代码时都能够阅读和理解名称。关于@nhgrif answer,使用var而不是let可以节省时间,编码可以创建另一个变量来计算cat年数。不要在问题中编辑答案。只要将一个标记为已接受。@StevensGarcia使用如果var
不仅节省了编码时间和代码行,而且效率更高,因为我们只在堆栈上创建一个变量,而不是两个,并且我们只将内存从位置a移动到位置b一次,而不是两次。
func textFieldDidChange(textField: UITextField){
if textField.text == "" {
//You can perfrom your activity here when textfield got blank or empty
}
else
{
//You can perfrom your activity here when textfield got not blank or not empty
}
}