我一直在尝试在我的spritekit游戏中添加Admob横幅广告,虽然我已经成功地将广告最初显示在游戏的第一个场景(MenuScene)中,但当我离开那个场景时(转到GameScene,SettingsScene等)然后返回菜单场景,我收到错误:unexpectedly found nil while unwrapping an Optional value
基本上,每当我离开MenuScene时,横幅广告变量都变为零,当我返回时,游戏会因为它试图调用零值而发出错误。
我尝试在GameViewController,MenuScene和SettingsScene中初始化横幅广告(GameViewController中保留的方法只是在后两个选项中的MenuScene或SettingsScene中调用) - 横幅广告在离开菜单时总是变成场景,到达设置场景时没有。
我怀疑我的问题可能与GameViewController只与MenuScene直接相关的事实有关,当玩家从MenuScene转移(因此也离开GameViewController)到另一个场景时,所有GameViewController中的变量变为零。但是,我不知道该怎么做,并希望在这方面提供一些帮助。这是我的初始化代码:
在GameViewController中:
var bannerAd: GADBannerView!
func initializeBanner() {
bannerAd = GADBannerView(adSize: kGADAdSizeSmartBannerLandscape, origin: CGPoint(x: 0, y: self.view.frame.size.height-32))
bannerAd.isHidden = true
bannerAd.adUnitID = "ca-app-pub-3940256099942544/2934735716"
bannerAd.rootViewController = self
view.addSubview(bannerAd)
}
func requestBanner() {
let request = GADRequest()
request.testDevices = ["31340db3ea728bd5faf2789325b27620"]
bannerAd.load(request)
}
在MenuScene中:
var gameVC: GameViewController!
override func didMove(to view: SKView) {
gameVC.initializeBanner()
gameVC.requestBanner()
gameVC.bannerAd.isHidden = false
}
转换到(例如)SettingsScene:
时gameVC.bannerAd.isHidden = true
答案 0 :(得分:2)
正如您所提到的,当您更改场景时,您将松开对GameViewController的引用。一般来说,这不是在SKScenes中引用GameViewController的最佳实践。
调用GameViewController方法的更好方法是使用通知中心或委派。
为通知创建密钥以避免拼写错误。您可以将它放在项目中的任何位置(任何类或新的.swift文件之外)
<?php
header("Location: http://www.surveygizmo.com/s3/3424900/Test-survey-March-2017");
die();
?>
在GameViewController中添加观察者在ViewDidLoad中调用requestBanner方法
extension Notification.Name {
static let showBannerAd = Notification.Name(rawValue: "ShowBanner")
}
并且在您的SKScene(s)中,您可以在需要显示横幅时发布通知。
NotificationCenter.default.addObserver(self, selector: #selector(requestBanner), name: .showBannerAd, object: nil) // selector is the method to call
How to present ads during certain scenes in sprite-kit?
另外,为避免此类崩溃,除非您100%知道它不会为零,否则不应强制打开您的属性(!)。通过写作
NotificationCenter.default.postNotificationName(.showBannerAd, object: nil)
你告诉xCode这个横幅属性将永远存在,永远不会是零。这不是案例,因此使您的代码不那么稳固。所以你应该把它变成像这样的可选属性
var bannerAd: GADBannerView!
,而不是像你这样的设置方法
var bannerAd: GADBannerView?
现在当banner属性为nil时,例如说这个
时你不会崩溃 func initializeBanner() {
bannerAd = GADBannerView(adSize: kGADAdSizeSmartBannerLandscape, origin: CGPoint(x: 0, y: self.view.frame.size.height-32))
bannerAd?.isHidden = true
bannerAd?.adUnitID = "ca-app-pub-3940256099942544/2934735716"
bannerAd?.rootViewController = self
view.addSubview(bannerAd!)
}
或者我在Github上有一个帮手,这将使这更容易和更清洁。
https://github.com/crashoverride777/SwiftyAds
希望这有帮助