Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 关闭presentingviewController后显示警报_Ios_Swift_In App Purchase_Uialertcontroller - Fatal编程技术网

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()移动到全局或在某个类中生成静态函数。这里是全球范围,你能告诉我为什么吗?