swift - 为什么 UITextFIeld 在 Swift 中返回可选值?
问题描述
我使用 aUITextField
输入数字,但是当我输入第一个数字时,它最终会打印nil
。然后,当我输入其他数字时,它会打印出我输入的数字,但optional
返回类型。为什么会这样?
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//convert string into number
let input = (numberLabel.text! as NSString).integerValue
//find answer to label when added by 1111
let answer = input + 1111
print(answer)
let numberText = Int(numberField.text!)
print("This is number text: \(numberText)
if answer == numberText {
print("correct")
//if user gets answer correct
} else {
//if user gets answer incorrect
}
}
解决方案
原因可能是因为您使用shouldChangeCharactersIn
which 直到第二个字符才表示字符的变化。理想情况下,您希望用户在完成答案并提交后收到正确答案的通知,在这种情况下,您需要使用以下内容textFieldDidEndEditing
:
class MyVC: UIViewController, UITextFieldDelegate {
let textField = UITextField()
var numberLabel: UILabel {
let label = UILabel()
label.text = "100"
return label
}
let button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(textField)
textField.borderStyle = .roundedRect
textField.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
textField.widthAnchor.constraint(equalToConstant: 200),
textField.heightAnchor.constraint(equalToConstant: 100)
])
textField.delegate = self
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
button.tag = 1
button.backgroundColor = .black
button.setTitle("Answer", for: .normal)
self.view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.leadingAnchor.constraint(equalTo: textField.trailingAnchor),
button.widthAnchor.constraint(equalToConstant: 200),
button.heightAnchor.constraint(equalToConstant: 100)
])
}
@objc func buttonPressed(_ sender: UIButton!) {
if case let tag = sender.tag, tag == 1 {
textField.resignFirstResponder()
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
//convert string into number
let input = (numberLabel.text! as NSString).integerValue
//find answer to label when added by 1111
let answer = input + 1111
print(answer)
if let numberText = Int(textField.text ?? "0") {
print("This is number text: \(numberText)")
if answer == numberText {
//if user gets answer correct
print("correct")
} else {
//if user gets answer incorrect
print("wrong")
}
}
}
}
推荐阅读
- java - 分页查询需要有分页参数【Spring Boot】
- sql - CREATE TABLE 从两个表中创建第三个表 JOIN 语句
- javascript - 如何检查 JS 变量是否为 Buffer
- junit4 - Reportportal 集成与稳定的空手道版本 0.9.5 一起使用?
- html - 为什么此表格行背景图像消失在表格单元格后面?
- pandas - 在 pandas v1.0.3 上访问具有多级索引的数据框
- mongodb - MongoDB:E11000 重复键错误集合:重复键:{ null }
- r - 闪亮的动作按钮不适用于模块
- javascript - 使用 map 和 filter 获取与布尔掩码中的“真”值相对应的索引数组
- visual-studio - xamarin.forms - 葡萄牙语中的 Visual Studio 生成从 ContentView 派生的 ContentPage