如何调用插页式广告加载到另一个 UIViewController 上?

How do I call an interstitial ad to load on another UIViewController?

我有一个 UIViewController,上面显示了一个 UIView;按下 UIView 上的按钮 加载 我的插页式广告。当随后显示 UIView 时,我希望以 rootVC 作为 UIViewController 显示插页式广告。

但是,这段代码似乎没有按预期工作:

1) 我的视图控制器:

class MyViewController: UIViewController {

let button: UIButton = {
    let btn = UIButton()
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("BUTTON", for: .normal)
    btn.addTarget(self, action: #selector(showUIView), for: .touchUpInside)
    return btn
}() 
@objc func showUIView(_ sender: UIButton) {
let popUp = MyUIView()
self.view.addSubview(popUp)
}

2) 我的 UIView:

class MyUIView: UIView {

var interstitial: GADInterstitial!

let button: UIButton = {
let btn = UIButton()
btn.translatesAutoresizingMaskIntoConstraints = false
btn.setTitle("UIVIEW BUTTON", for: .normal)
btn.addTarget(self, action: #selector(prepareInterstitial), for: .touchUpInside)
return btn
}()

@objc func prepareInterstitial(_ sender: UIButton) {
    interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
    let request = GADRequest()
    interstitial.load(request)

dismissPopUp()

if interstitial.isReady {
  interstitial.present(fromRootViewController: MyViewController())
       }
  }

我在控制台中得到这个:

Warning: Attempt to present <GADFullScreenAdViewController: 0x7f8611e22fc0> on <Project.MyViewController: 0x7f8612884800> whose view is not in the window hierarchy!`

我不明白,因为 MyViewController 仍然是视图层次结构的重要组成部分。

如果有人能告诉我如何解决这个错误,我将不胜感激,我对编码还比较陌生,不确定自己做错了什么。谢谢!

这不起作用的原因是因为您在此处创建全新 VC:

interstitial.present(fromRootViewController: MyViewController())

这个MyViewController()不是屏幕上显示的VC!您刚刚通过调用其初始化程序创建。

您需要以某种方式获取屏幕上显示的 VC。一种简单的方法是将 rootVC 属性 添加到 MyUIView:

weak var rootVC: UIViewController?

然后展示这个:

if let rootVC = self.rootVC { // nil check!
    interstitial.present(fromRootViewController: rootVC)
}

showUIView中,将self设为rootVC:

@objc func showUIView(_ sender: UIButton) {
    let popUp = MyUIView()
    popUp.rootVC = self
    self.view.addSubview(popUp)
}