我希望用户按下按钮,然后让他们能够看到他们可以输入输入的警报(设置服务的价格)。另一个逻辑涉及将数据保存到数据库,这与我的问题无关。
我使用以下示例:
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
}
答案 0 :(得分:2)
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)
}
答案 1 :(得分:-1)
我的猜测是,当你提出警报时,你当前的ViewController是警报viewController ......而在你的警报中,没有变量tField。
在示例中,您引用警报仅在使用tField值打印后显示。这就是为什么它在那里起作用而且在你的情况下不起作用。