我已经成功地让广告最初出现在游戏的第一个场景(MenuScene)中,当我离开那个场景(去GameScene,SettingsScene等)然后回到菜单场景时,我得到了错误: unexpectedly found nil while unwrapping an Optional value
基本上,每当我离开MenuScene时, Banner 广告变量都变为零,当我返回时,游戏会因为尝试调用零值而出错 .
我已经尝试在GameViewController,MenuScene和SettingsScene中初始化 Banner 广告(GameViewController中保留的方法只是在后两个选项中的MenuScene或SettingsScene中调用) - Banner 广告在离开菜单场景时总是成为,到达设置场景时没有 .
我怀疑我的问题可能与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
1 回答
正如您所提到的,当您更改场景时,您将放弃对GameViewController的引用 . 一般来说,这不是在SKScenes中引用GameViewController的最佳实践 .
调用GameViewController方法的更好方法是使用通知中心或委托 .
为通知创建密钥以避免拼写错误 . 您可以将它放在项目中的任何位置(任何类或新的.swift文件之外)
比你的GameViewController在ViewDidLoad中添加观察者来调用requestBanner方法
而在您的SKScene中,您可以在需要显示 Banner 时发布通知 .
How to present ads during certain scenes in sprite-kit?
另外,为了避免这种崩溃你不应该强制打开你的属性(!),除非你100%知道它不会是零 . 通过写作
你告诉xCode这个 Banner 属性将永远存在,永远不会是零 . 这不是案例,因此使您的代码不那么稳固 . 所以你应该把它变成像这样的可选属性
而不是像你这样的设置方法
现在,当banner属性为nil时,例如说这个就不会崩溃
或者我在Github上有一个帮手,这将使这更容易和更清洁 .
https://github.com/crashoverride777/SwiftyAds
希望这可以帮助