Показывать оповещение после отклонения presentingviewController - PullRequest
1 голос
/ 18 апреля 2019

Когда пользователь приобрел completion handler, сообщите мне и отклоните viewController. Тем не менее, я хочу отобразить / показать alert пользователю после viewController отклонено. В тот момент, когда я прохожу через отладчик, он проходит через код, но предупреждение не отображается. Все еще встраивается в яблочный, который говорит All set. Есть ли способ отобразить мое предупреждение после отклонения viewController.

override func viewWillDisappear(_ pAnimated: Bool) {
    super.viewWillDisappear(pAnimated)
    self.notifyForUserHasPurchasedProduct {
        self.presentingViewController?.dismiss(animated: true, completion: {
            UIAlertController.bs_showAlertFrom(self, title: "AppName", message: "Thank you. Your purchase was successful")
        })
    }
}

1 Ответ

2 голосов
/ 18 апреля 2019

Вам нужно позвонить self.present(alert, animated: true), чтобы показать предупреждение.Когда ViewController self отсутствует, вам нужно изменить код на presentedViewController.present(alert, animated: true)

Я построил несколько функций:

extension UIViewController {

    func topMostViewController() -> UIViewController {

        if let presented = self.presentedViewController {
            return presented.topMostViewController()
        }

        if let navigation = self as? UINavigationController {
            return navigation.visibleViewController?.topMostViewController() ?? navigation
        }

        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topMostViewController() ?? tab
        }

        return self
    }
}

func getRootController () -> UIViewController { // function in global scope
    return (UIApplication.shared.delegate?.window!!.rootViewController)!
}

И затем используйте их как здесь:

override func viewWillDisappear(_ pAnimated: Bool) {
    super.viewWillDisappear(pAnimated)
    self.notifyForUserHasPurchasedProduct {
        self.presentingViewController?.dismiss(animated: true, completion: {
        let alert = UIAlertController(title: "AppName", message: "Thank you. Your purchase was successful", preferredStyle: .alert)

        let topC = getRootController().topMostViewController()
        topC.present(alert, animated: true, completion: nil)
        })
    }
}
...