iOS - UIAlertController 操作未触发处理程序

iOS - UIAlertController actions not triggering handler

提问人:Tamim Attafi 提问时间:4/24/2020 最后编辑:Tamim Attafi 更新时间:10/9/2022 访问量:158

问:

我对 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这是我的,它有一个父级的类型和其他几个协议。ViewControllerUIViewController

我可能做错了什么?

编辑:我知道它不执行的方式是使用断点而不是依赖print("...")

此外,由于我在添加操作之前添加了 right,因此可空性检查是无用的,并且 永远不会 ,因此在这两种情况下,都应该触发断点或执行断点,这两者都没有发生。TextFieldtextFields.firstnilprint("...")

编辑 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:即使取消也不起作用。dialogbutton

编辑 3:我的解雇在课堂上被覆盖,但它正常通过完成:functionsuperclosure

 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)
    }
}
iOS Swift iPhone UIVieviceController 对话框

评论

0赞 Larme 4/24/2020
它不起作用,因为打印不正确?嗯,是因为是零,还是因为零?print("Your amount: \(amount)")alert.textFields?.first?.textDouble(input)
0赞 Mo Abdul-Hameed 4/24/2020
正如@Larme所说,你认为它为什么有效?
0赞 Tamim Attafi 4/24/2020
@Larme,我不依赖于print()的输出,我在可空性检查行上放置了一个断点
0赞 Tamim Attafi 4/24/2020
我编辑了问题
0赞 Larme 4/24/2020
let amount = Double(input)那是零吗?这是失败的原因吗?你能用你的代替吗?if let ... {}if let ... {} else { print("oops") }

答:

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)
    }
}