如何在UIView类中调用fromRootViewController方法?

问题描述 投票:3回答:1

编辑:这是一个非常初学者的问题,所以我事先表示歉意

[这是我要破解的作业的一部分,但似乎是不可能的。我已经在Google Admob的UIView上为我的UIView实现了GADRewardBasedVideoAdDelegate,并设法在“ PopUp”(这是UIView的子类)中实现了该委托的所有其他实例。

但是,似乎无法实现这一方法,这是:

    if GADRewardBasedVideoAd.sharedInstance().isReady == true {    
        GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self)
         }

这里的问题是代码的“ .present(fromRootViewController:self)部分,因为self并不是指向ViewController,而是指向UIView()。

老实说,我不知道该如何解决这个问题,因此我在此问题上的尝试无可奉告。我真的很感谢我对这个主题所能提供的任何指导,我在这里停留了2天的大部分时间。

这里是popUp类,以防使我的代码更加清晰

import UIKit
import GoogleMobileAds

class Popup: UIView, GADRewardBasedVideoAdDelegate {

    func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, didRewardUserWith reward: GADAdReward) {
        let vc = MainVC()
        vc.lifeNumber += 3
        vc.numberOfLivesLabel.text = "\(vc.lifeNumber)"
    }

    func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        GADRewardBasedVideoAd.sharedInstance().load(GADRequest(), withAdUnitID: "ca-app-pub-3940256099942544/1712485313")
    }


    let playButton: UIButton = {
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setImage(UIImage(named: "icon"), for: .normal)
        button.addTarget(self, action: #selector(play), for: .touchUpInside)
        return button
    }()

    @objc func play() {
        print("Play button pressed.")
        if GADRewardBasedVideoAd.sharedInstance().isReady == true {
            GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self) //<---------ERRONEOUS CODE
             }
    }


    override init(frame: CGRect) {
        super.init(frame: frame)

        GADRewardBasedVideoAd.sharedInstance().load(GADRequest(), withAdUnitID: "ca-app-pub-3940256099942544/1712485313")
        GADRewardBasedVideoAd.sharedInstance().delegate = self


self.addSubview(popUpContainer)
playButton.centerXAnchor.constraint(equalTo: popUpContainer.centerXAnchor),
    playButton.topAnchor.constraint(equalTo: popUpContainer.topAnchor, constant: 15),
    playButton.heightAnchor.constraint(equalToConstant: 300)
    playButton.widthAnchor.constraint(equalToConstant: 300)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("Could not run init(coder)")
    }
}

这是我的MainVC()

class MainVC: UIViewController {

    var lifeNumber: Int = 3

    lazy var numberOfLivesLabel: UILabel = {
        let label = UILabel()
        label.text = "\(lifeNumber)"
        label.font = UIFont(name: "Copperplate", size: 25)
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    let buttonOne: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Hit me!", for: .normal)
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    @objc func buttonPressed() {
        let popUpView = Popup()
        self.view.addSubview(popUpView)
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBlue

        view.addSubview(buttonOne)
        view.addSubview(numberOfLivesLabel)

        buttonOne.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        buttonOne.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        buttonOne.heightAnchor.constraint(equalToConstant: 300).isActive = true
        buttonOne.widthAnchor.constraint(equalToConstant: 300).isActive = true

        numberOfLivesLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        numberOfLivesLabel.bottomAnchor.constraint(equalTo: buttonOne.topAnchor, constant: 50).isActive = true

    }
}
swift admob
1个回答
5
投票

This code from hacking with swift will help.

    extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}

使用扩展名获得弹出窗口的父视图控制器。

if GADRewardBasedVideoAd.sharedInstance().isReady == true {    
    GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self.findViewController())
     }

您可能也希望将其放在主队列中

    if GADRewardBasedVideoAd.sharedInstance().isReady == true {    
      DispatchQueue.main.async {
         GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self.findViewController())
     }
    }
© www.soinside.com 2019 - 2024. All rights reserved.