Luiz
Luiz

Reputation: 1315

Show ad banner by touching a button

Explanation

The title pretty much asks for itself. I'm trying to make a button activate an ad banner, but Xcode returns me this message below; so, because of the UIViewController, I saw that this banner should be called on GameViewController, not GameScene. I looked for it everywhere, but did not find how to call this banner from GameScene or another way to activate this banner by a button.

Cannot convert value of type 'GameScene' to expected argument type 'UIViewController!'


Code

This code below is pretty simple. It has a button on its attempt to call an ad banner.

import SpriteKit
import Ads

class GameScene: SKScene {

    var button = SKSpriteNode()

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        button = SKSpriteNode(imageNamed: "button")
        button.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
        button.setScale(0.4)
        addChild(button)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* Called when a touch begins */

        for touch in touches {

            let location = touch.locationInNode(self)
            let node = nodeAtPoint(location)

            if node == button{
                Ads.showAd(AdsShowStyle.BannerBottom, rootViewController: self) //issue line
            }
        }
    }
}

Attempt

After some research, I found out that it might be possible by using delegation. Following the highest voted answer of this question, I came up to this code below, but I'm having many issues that I'm, unsuccessfully, struggling to solve.


GameScene.swift

GameScene

GameViewController.swift

GameViewController


Thanks in advance,
Luiz.

Upvotes: 1

Views: 195

Answers (1)

behind the aura
behind the aura

Reputation: 296

Since you are using SpriteKit but we don't know what ad network you are using, I would recommend using a NSNotificationCenter command in GameViewController and use a postNotificationName command in the GameScene.swift instead of a ViewControllerDelegate. This would allow your ad code to be used in any other .swift files. Here's a better explanation of this from another post if needed

Note: This may or may not work depending on ad network

GameViewController.swift (from my project)

import UIKit
import SpriteKit
import GoogleMobileAds

class GameViewController: UIViewController, GADAdDelegate {


var adMobBanner : GADBannerView!


override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = GameScene(fileNamed:"GameScene") {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }



    adMobBanner = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
    adMobBanner.adUnitID = "your ad unit id"
    adMobBanner.rootViewController = self
    adMobBanner.frame = CGRectMake(0, view.bounds.height - adMobBanner.frame.size.height, adMobBanner.frame.size.width, adMobBanner.frame.size.height)


    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.showAdMob), name: "showAdMobKey", object: nil)




}


func showAdMob() {

    let request : GADRequest = GADRequest()
    adMobBanner.loadRequest(request)
    self.view.addSubview(adMobBanner)

    print("adMob")

}

GameScene.swift (edited yours)

import SpriteKit
import Ads

class GameScene: SKScene {

var button = SKSpriteNode()

override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    button = SKSpriteNode(imageNamed: "button")
    button.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    button.setScale(0.4)
    addChild(button)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    /* Called when a touch begins */

    for touch in touches {

        let location = touch.locationInNode(self)

        if (button.containsPoint(location)) {

            NSNotificationCenter.defaultCenter().postNotificationName("showAdMobKey", object: nil)

        }

     }
  }
} 

Upvotes: 1

Related Questions