Как вызвать промежуточную рекламу для загрузки на другой UIViewController? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть UIViewController с отображаемым UIView; нажатие кнопки на UIView загружает мое промежуточное объявление. Когда впоследствии отображается UIView, я хочу, чтобы вставка отображалась с rootV C в качестве UIViewController.

Однако этот код не работает должным образом:

1) My View Controller:

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) My 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 по-прежнему является частью иерархии представления.

Я был бы очень благодарен, если бы кто-то может показать мне, как исправить эту ошибку, я относительно новичок в кодировании и не уверен, что я делаю неправильно. Спасибо!

1 Ответ

0 голосов
/ 29 марта 2020

Причина, по которой это не работает, заключается в том, что вы создаете совершенно новый V C здесь:

interstitial.present(fromRootViewController: MyViewController())

Этот MyViewController() не V C это показано на экране! Вы только что создали, вызвав его инициализатор.

Вам нужно каким-то образом получить V C, который показан на экране. Один простой способ сделать это - добавить свойство 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)
}
...