提问人:Tamim Attafi 提问时间:4/24/2020 最后编辑:Tamim Attafi 更新时间:10/9/2022 访问量:158
iOS - UIAlertController 操作未触发处理程序
iOS - UIAlertController actions not triggering handler
问:
我对 iOS 非常陌生。我试图向用户显示一个对话框以获取一些输入,但操作从未触发。我已经在网上搜索了几个小时,但似乎没有答案适合我。
这是我尝试用来显示对话框的函数:
private func showAmountDialog(type: String, onComplete: @escaping (Double) -> Void) {
let alert = UIAlertController(title: "Enter an amount", message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: LzStrings.Common_Cancel, style: .cancel, handler: nil))
alert.addTextField(configurationHandler: { textField in
textField.placeholder = "0.00 \(type)"
textField.keyboardType = .decimalPad
})
alert.addAction(UIAlertAction(title: LzStrings.Common_OK, style: .default) { (UIAlertAction) in
if let input = alert.textFields?.first?.text, let amount = Double(input) {
print("Your amount: \(amount)")
}
})
self.present(alert, animated: true)
}
self
这是我的,它有一个父级的类型和其他几个协议。ViewController
UIViewController
我可能做错了什么?
编辑:我知道它不执行的方式是使用断点而不是依赖print("...")
此外,由于我在添加操作之前添加了 right,因此可空性检查是无用的,并且 永远不会 ,因此在这两种情况下,都应该触发断点或执行断点,这两者都没有发生。TextField
textFields.first
nil
print("...")
编辑 2:由于可以稍微分散注意力,我以这种方式编辑了我的代码并再次测试:if statement
alert.addAction(UIAlertAction(title: LzStrings.Common_OK, style: .default) { (UIAlertAction) in
if let input = alert.textFields?.first {
if let amount = Double(input.text ?? "") {
print("Your amount: \(amount)")
} else {
print("Can't cast this string to double")
}
} else {
print("Text field is null")
}
})
尽管如此,没有来自 .PS:即使取消也不起作用。dialog
button
编辑 3:我的解雇在课堂上被覆盖,但它正常通过完成:function
super
closure
override open func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
if let navigationController = self.navigationController as? NavigationController {
navigationController.dismiss(animated: flag, completion: completion)
} else {
super.dismiss(animated: flag, completion: completion)
}
}
答:
0赞
Tamim Attafi
4/24/2020
#1
在与我的一位同事交谈后,我们发现要显示标准,我们必须使用这个:UIAlertController
self.view.window!.rootViewController?.present(alert, animated: true, completion: nil)
取而代之的是这个
self.present(alert, animated: true, completion: nil)
它解决了我的问题。我希望有人会觉得这对您有所帮助。
0赞
cvld
10/9/2022
#2
另一种选择是使用 ViewController 的扩展:
extension UIViewController {
//Show a basic alert
func showAlert(alertText : String, alertMessage : String) {
let alert = UIAlertController(title: alertText, message: alertMessage, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Got it", style: UIAlertActionStyle.default, handler: nil))
//Add more actions as you see fit
self.present(alert, animated: true, completion: nil)
}
}
评论
print("Your amount: \(amount)")
alert.textFields?.first?.text
Double(input)
let amount = Double(input)
那是零吗?这是失败的原因吗?你能用你的代替吗?if let ... {}
if let ... {} else { print("oops") }