我希望用户按下一个按钮,然后让他们能够看到一个警报,在那里他们可以输入(为服务设定价格)。另一种逻辑是将数据保存到数据库中,这与我的问题并不相关。
我使用以下示例:
https://stackoverflow.com/a/30139623/2411290
它确实有效,因为它正确地显示了警报,但是一旦我包括
print("Amount: \(self.tField.text)")
无法识别“self.tField.text”。我得到的具体错误是:
“testVC”类型的值没有成员“tField”
@IBAction func setAmount(_ sender: Any) {
var tField: UITextField!
func configurationTextField(textField: UITextField!)
{
print("generating textField")
textField.placeholder = "Enter amount"
tField = textField
}
func handleCancel(alertView: UIAlertAction!)
{
print("Cancelled")
}
let alert = UIAlertController(title: "Set price of service", message: "", preferredStyle: .alert)
alert.addTextField(configurationHandler: configurationTextField)
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:handleCancel))
alert.addAction(UIAlertAction(title: "Done", style: .default, handler:{ (UIAlertAction) in
print("Done !!")
}))
self.present(alert, animated: true, completion: {
print("completion block")
print("Amount: \(self.tField.text)") // Error here
})
//// other logic for app
}
最佳答案
tField
是setAmount
函数中的局部变量。它不是类的属性。
更改:
self.tField.text
致:
tField.text
这将允许您访问局部变量。
但真正的问题是,为什么要在这个函数中创建一个
UITextField
的局部变量?当文本字段在任何地方都不使用时,为什么要打印它的文本?很可能您应该访问“完成”按钮的操作处理程序内的警报文本字段。在显示警报的完成块内不需要执行任何操作。
@IBAction func setAmount(_ sender: Any) {
let alert = UIAlertController(title: "Set price of service", message: "", preferredStyle: .alert)
alert.addTextField(configurationHandler: { (textField) in
print("generating textField")
textField.placeholder = "Enter amount"
})
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) { (action) in
print("Cancelled")
})
alert.addAction(UIAlertAction(title: "Done", style: .default) { (action) in
print("Done !!")
if let textField = alert.textFields?.first {
print("Amount: \(textField.text)")
}
})
self.present(alert, animated: true, completion: nil)
}