Swift 使用isHidden隐藏横幅广告=true

Swift 使用isHidden隐藏横幅广告=true,swift,sprite-kit,admob,Swift,Sprite Kit,Admob,我目前正在使用GameViewController中的以下代码从admob调用横幅广告 class GameViewController: UIViewController { var bannerView: GADBannerView! } override func viewDidLoad() { super.viewDidLoad() bannerView = GADBannerView(adSize: kGADAdSizeBanner) addBannerVie

我目前正在使用GameViewController中的以下代码从admob调用横幅广告

class GameViewController: UIViewController {
var bannerView: GADBannerView!
}

override func viewDidLoad() {
    super.viewDidLoad()
    bannerView = GADBannerView(adSize: kGADAdSizeBanner)
    addBannerViewToView(bannerView)
    bannerView.adUnitID = "ca-app-pub-XXXXXXXXX"  // Default Google Test Ad Address
    bannerView.rootViewController = self
    bannerView.load(GADRequest())
    bannerView.isHidden = false // <----- This works, but doesn't work in GameScene.swift
此代码工作并显示测试广告。但是,在GameSecene.swift中,当我按下按钮时,我运行此代码以尝试隐藏广告

GameViewController().bannerView.isHidden = true
这会导致应用程序崩溃,并出现“致命错误:隐式展开可选值时意外发现零”。如果我改变它,它不会崩溃,但广告不会隐藏

GameViewController().bannerView?.isHidden = true
然而在GameViewController中,如果我简单地将isHidden的值更改为true,那么它就可以工作

bannerView.isHidden = true

当我按下按钮时,是否能够从GameSecene.swift中隐藏横幅广告?

您正在创建
GameViewController
的新实例,并切换其
bannerView
isHidden
属性。您应该切换正在显示的
GameViewController
实例的
bannerView
isHidden
属性。

如果有人想知道,这是我找到的隐藏横幅的解决方案:

处理GameViewController.swift文件中的所有banner内容。在其中,为bannerView变量指定一个标记值。然后在加载场景时,使用标记id加载bannerView,然后将其.isheden属性设置为true

GameViewController.swift

bannerView.tag = 100
斯威夫特

// hide banner
let bannerView = self.view?.viewWithTag(100) as! GADBannerView?
bannerView?.isHidden = true

// show banner
let bannerView = self.view?.viewWithTag(100) as! GADBannerView?
bannerView?.isHidden = false

调用
GameViewController()
时,您正在创建
GameViewController
的新实例

GameViewController().bannerView
上,您正在从此新实例访问
bannerView
,并且由于它是未在此实例上设置的可选值,因此当您尝试访问它时-将导致崩溃

您需要的是访问主
GameViewController
,其中设置了
bannerView

有两种简单的方法可以从其他类调用
GameViewController
函数:通过
委托
或通过使类实例
静态

//   DELEGATE
//
// You have access only to the functions you declared inside the procotol. 
// Only the classes that conforms to that protocol have access to the functions.
//
// GameViewController.swift

protocol GameView_Delegate
{
    func hide_ads()
}

class GameViewController: UIViewController, GameView_Delegate
{
    override func viewDidLoad()
    {

    //   ... 

    if let view = self.view as! SKView?
    {
        if let scene = SKScene(fileNamed: "GameScene")
        {        
            scene.scaleMode = .aspectFill

            // pass protocol reference
            scene.gv_delegate = self
        }

        view.presentScene(scene)
     }

    // ...

    }

    func hide_ads()
    {
        // hide ads code

        bannerView.isHidden = true
    }
}

// GameScene.swift

class GameScene: SKScene
{
    var gv_delegate : GameView_Delegate!

    func settings()
    {
        // call function hide_ads from GameViewController
        gv_delegate.hide_ads()
    }

    func lost_scene()
    {
        let transition = SKTransition.fade(with: UIColor.white, duration: 1.0)
        let next_scene = LostScene()
        next_scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        next_scene.scaleMode = self.scaleMode
        next_scene.size = self.size

        // before moving to next scene, we must pass the delegate, so we
        // don't  lose the connection with the GameViewController
        next_scene.gv_delegate = gv_delegate
        self.view?.presentScene(next_scene, transition: transition)
    }
}

// LostScene.swift

class LostScene: SKScene
{
    var gv_delegate : GameView_Delegate!

    func settings()
    {
        // call function hide_ads from GameViewController
        gv_delegate.hide_ads()
    }

    func game_scene()
    {
        let transition = SKTransition.fade(with: UIColor.white, duration: 1.0)
        let next_scene = GameScene()
        next_scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        next_scene.scaleMode = self.scaleMode
        next_scene.size = self.size

        // before moving to next scene, we must pass the delegate, so we
        // don't lose the connection with the GameViewController
        next_scene.gv_delegate = gv_delegate
        self.view?.presentScene(next_scene, transition: transition)
    }
}
当您进入一个新场景时,例如
LostScene
,在我们的例子中,旧场景
GameSecene
被释放(所有变量清空,所有引用被销毁),并且一个新的
GameSecene
实例被创建并显示在屏幕上。在转换到新场景之前,您应该传递引用,以免丢失与
GameViewController
的连接(如我的示例所示)


这将创建一个新实例GameViewController()。您需要获取已经存在的实例。这是因为您的bannerView当时为零,请向我展示您的GameViewController片段,说明您如何持有对bannerView.var bannerView:GADBannerView的引用!这是在GameViewController中声明的。我不知道如何访问GameViewController中创建的“var bannerView:GadBanerView!”并在GameSevent中使用它。Swift使用您在
GameSevent
中使用的
GameViewController
实例访问
bannerView
。类似于
gameViewController.bannerView.ishiden.toggle()
中的
GameScene
中的
var gameViewController:gameViewController
GameScene
中给出。您可能不需要阅读一些关于如何在ViewController之间传递信息的教程就可以深入理解这一点。谢谢。我有点明白你的意思。我会调查的。
//   DELEGATE
//
// You have access only to the functions you declared inside the procotol. 
// Only the classes that conforms to that protocol have access to the functions.
//
// GameViewController.swift

protocol GameView_Delegate
{
    func hide_ads()
}

class GameViewController: UIViewController, GameView_Delegate
{
    override func viewDidLoad()
    {

    //   ... 

    if let view = self.view as! SKView?
    {
        if let scene = SKScene(fileNamed: "GameScene")
        {        
            scene.scaleMode = .aspectFill

            // pass protocol reference
            scene.gv_delegate = self
        }

        view.presentScene(scene)
     }

    // ...

    }

    func hide_ads()
    {
        // hide ads code

        bannerView.isHidden = true
    }
}

// GameScene.swift

class GameScene: SKScene
{
    var gv_delegate : GameView_Delegate!

    func settings()
    {
        // call function hide_ads from GameViewController
        gv_delegate.hide_ads()
    }

    func lost_scene()
    {
        let transition = SKTransition.fade(with: UIColor.white, duration: 1.0)
        let next_scene = LostScene()
        next_scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        next_scene.scaleMode = self.scaleMode
        next_scene.size = self.size

        // before moving to next scene, we must pass the delegate, so we
        // don't  lose the connection with the GameViewController
        next_scene.gv_delegate = gv_delegate
        self.view?.presentScene(next_scene, transition: transition)
    }
}

// LostScene.swift

class LostScene: SKScene
{
    var gv_delegate : GameView_Delegate!

    func settings()
    {
        // call function hide_ads from GameViewController
        gv_delegate.hide_ads()
    }

    func game_scene()
    {
        let transition = SKTransition.fade(with: UIColor.white, duration: 1.0)
        let next_scene = GameScene()
        next_scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        next_scene.scaleMode = self.scaleMode
        next_scene.size = self.size

        // before moving to next scene, we must pass the delegate, so we
        // don't lose the connection with the GameViewController
        next_scene.gv_delegate = gv_delegate
        self.view?.presentScene(next_scene, transition: transition)
    }
}
// STATIC
//
// the properties and functions are available from everywhere
//
// GameViewController.swift

class GameViewController: UIViewController
{
    static var shared : GameViewController!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        GameViewController.shared = self

        // ...

    }

    func hide_ads()
    {
        // hide ads code
        bannerView.isHidden = true
    }
}


// GameScene.swift

class GameScene: SKScene
{
    func settings()
    {
        // call function hide_ads from GameViewController

        GameViewController.shared.hide_ads()
        // or GameViewController.shared.bannerView.isHidden = true
    }
}