编辑:这是一个非常初学者的问题,所以我事先表示歉意
[这是我要破解的作业的一部分,但似乎是不可能的。我已经在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
}
}
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())
}
}