gpt4 book ai didi

ios - Admob Banner 广告在 SpriteKit 切换场景时变为 Nil

转载 作者:搜寻专家 更新时间:2023-11-01 07:14:47 24 4
gpt4 key购买 nike

我一直在尝试将 Admob 横幅广告添加到我的 spritekit 游戏中,尽管我已经成功地让广告最初出现在游戏的第一个场景 (MenuScene) 中,但当我离开该场景时(去GameScene,SettingsScene等)然后返回菜单场景,我得到错误:unexpectedly found nil while unwrapping an Optional value

基本上,无论何时我离开 MenuScene,横幅广告变量都会变为 nil,而当我返回它时,游戏就会出错,因为它试图调用 nil 值。

我已经尝试在 GameViewController、MenuScene 和 SettingsScene 中初始化横幅广告(方法保留在 GameViewController 中,只是在后两个选项的 MenuScene 或 SettingsScene 中被调用)- 横幅广告总是在离开菜单时变成场景,到达设置场景时为零。

我怀疑我的问题可能与以下事实有关:GameViewController 仅与 MenuScene 直接相关,并且当玩家从 MenuScene 过渡到另一个场景(因此也从 GameViewController 过渡)时,所有GameViewController 中的变量变为 nil。但是,我不知道该怎么做,希望能在这方面提供一些帮助。这是我的初始化代码:

在 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)
}

在菜单场景中:

var gameVC: GameViewController!

override func didMove(to view: SKView) {
gameVC.initializeBanner()
gameVC.requestBanner()
gameVC.bannerAd.isHidden = false
}

当过渡到(例如)SettingsScene 时:

gameVC.bannerAd.isHidden = true

最佳答案

正如您所提到的,当您更改场景时,您将失去对 GameViewController 的引用。一般来说,在 SKScenes 中引用 GameViewController 不是最佳做法。

调用 GameViewController 方法的更好方法是使用通知中心或委托(delegate)。

为您的通知创建一个 key 以避免拼写错误。你可以把它放在项目中任何你喜欢的地方(在任何类或新的 .swift 文件之外)

 extension Notification.Name {
static let showBannerAd = Notification.Name(rawValue: "ShowBanner")
}

然后在您的 GameViewController 中添加 ViewDidLoad 中的观察者以调用 requestBanner 方法

NotificationCenter.default.addObserver(self, selector: #selector(requestBanner), name: .showBannerAd, object: nil) // selector is the method to call

并且在您的 SKScene 中,您可以在需要显示横幅时像这样发布通知。

 NotificationCenter.default.postNotificationName(.showBannerAd, object: nil)

How to present ads during certain scenes in sprite-kit?

另外,为了避免此类崩溃,您不应该强行解包您的属性(!),除非您 100% 知道它不会为零。通过写作

 var bannerAd: GADBannerView!

您告诉 xCode 这个横幅属性将永远存在并且永远不会为零。事实并非如此,因此会使您的代码不那么可靠。因此,您应该像这样将其设为可选属性

 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!)
}

现在当 banner 属性为 nil 时你不会崩溃,例如说这个

 bannerAd?.isHidden = true

或者,我在 Github 上有一个助手,这将使这一切变得更容易和更清晰。

https://github.com/crashoverride777/SwiftyAds

希望对你有帮助

关于ios - Admob Banner 广告在 SpriteKit 切换场景时变为 Nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42772873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com