iOS - Действия UIAlertController не вызывают обработчик - PullRequest
0 голосов
/ 23 апреля 2020

Я чрезвычайно новичок в iOS. Я пытаюсь показать диалог пользователю, чтобы получить какой-то ввод, но действия никогда не запускаются. Я искал в net несколько часов, и, похоже, у меня нет ответа.

Вот функция, которую я пытаюсь использовать для отображения диалогового окна:

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("...")

Кроме того, поскольку я добавил 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")
        }
    })

Тем не менее, от dialog нет отзывов. PS : Даже Отмена 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)
    }
}

1 Ответ

0 голосов
/ 24 апреля 2020

После разговора с одним из моих коллег мы обнаружили, что для показа стандарта UIAlertController мы должны использовать это:

self.view.window!.rootViewController?.present(alert, animated: true, completion: nil)

Вместо этого

self.present(alert, animated: true, completion: nil)

Это исправил мою проблему. Я надеюсь, что кто-то найдет это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...