Ios 关闭presentingviewController后显示警报
当用户购买了Ios 关闭presentingviewController后显示警报,ios,swift,in-app-purchase,uialertcontroller,Ios,Swift,In App Purchase,Uialertcontroller,当用户购买了completion handler时,通知我并解除viewController。但是,我想在解除viewController后向用户显示/显示警报。当我在调试器中单步执行时,它会遍历代码,但不会显示警报。仍然内置在苹果的一个上面,上面写着全部设置。是否有一种方法可以在关闭viewController后显示警报 override func viewWillDisappear(_ pAnimated: Bool) { super.viewWillDisappear(pAnima
completion handler
时,通知我并解除viewController
。但是,我想在解除viewController
后向用户显示/显示警报。当我在调试器中单步执行时,它会遍历代码,但不会显示警报。仍然内置在苹果的一个上面,上面写着全部设置
。是否有一种方法可以在关闭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")
})
}
}
您需要调用self.present(警报,动画:true)
来显示警报。当ViewController
self
不存在时,您需要将代码更改为presentedViewController.present(警报,动画: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)
})
}
}
不起作用。我在一个扩展中创建了一个警报,然后将它放在那里。我看不出我的代码和你的代码有什么区别。您创建了一个
alertController
对象,我也在扩展中这样做,我在这个viewController
Ok中调用它。您需要找到屏幕上显示的控制器,并调用presentedViewController.present(警报,动画:true)
您忘记在getRootController().topMostViewController()上调用self
。应该是self.getRootController().topMostViewController()
。由于您处于当前的ViewController
中,因此不要在那里使用self
。将getRootController()移动到全局或在某个类中生成静态函数。这里是全球范围,你能告诉我为什么吗?