2017-01-31 24 views
0

Я включил представление баннера в сцену в моем приложении, однако я не могу интегрировать рекламное объявление внутри другой сцены. Вот мой код: импорт SpriteKit импорта GameKit импорта GoogleMobileAdsПредставление межстраничного объявления в игре над сценой, связанной с GameViewController?

class GameOverMenu: SKScene, GKGameCenterControllerDelegate, UIAlertViewDelegate { 

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

var myTimer = Timer() 


override func didMove(to view: SKView) { 

createAndLoadInterstitial() 

startMyTimer() 




} 


func createAndLoadInterstitial() { 
interstitial = GADInterstitial(adUnitID: "...") 
let request = GADRequest() 
request.testDevices = [ kGADSimulatorID, "..." ] 
interstitial.load(request) 
} 


func startMyTimer() { 
myTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(GameOverMenu.myFunction), userInfo: nil, repeats: false) 

} 

func myFunction(){ 

if interstitial.isReady { 
    interstitial.present(fromRootViewController: viewController) 
} else { 
    print("Ad wasn't ready") 
} 

} 

Это не удается, когда он пытается загрузить с «фатальной ошибкой: неожиданно найдено нолем, а разворачивание необязательного значения». Проблема заключается ниже, как если бы код отображался следующим образом, и я загружаю сцену GameOver, когда приложение запускает ее, отлично работает. Как я могу это исправить?

if let view = self.view as! SKView? { 




    // Load the SKScene from 'MainMenu.sks' 
    if let scene = MainMenuScene(fileNamed: "MainMenu") { 

     scene.viewController = self 

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

     // Present the scene 
     view.presentScene(scene) 


    } 

    if let scene3 = GameOverMenu(fileNamed: "GameOver") { 

     scene3.viewController = self 

     // Set the scale mode to scale to fit the window 
     scene3.scaleMode = .aspectFill 

     view.presentScene(scene3) 





    } 

ответ

0

Проблема заключается в том, что при переходе от 2-й сцен вы потеряете ссылку на GameViewController например

scene3.viewController = self 

вот почему это работает только при запуске приложения.

Вы также используете! по этим свойствам

var viewController: GameViewController! 
var interstitial: GADInterstitial! 

поэтому, если они ноль, вы столкнетесь. Так вы всегда должны использовать? когда вы не на 100% уверены, что что-то есть.

var viewController: GameViewController? 
var interstitial: GADInterstitial? 

, а не в вашем коде, таком как «myFunction», вы будете использовать «?» и «если пусть» не сбой, когда свойства равны нулю.

if let ad = interstitial, let vc = viewController, ad.isReady { 
     ad.present(fromRootViewController: vc) 
    } else { 
     print("Ad wasn't ready") 
    } 

Общее исправление для вашей проблемы в том, что вы действительно должны переместить весь код AdMob непосредственно в GameViewController. Чем вы можете использовать что-то вроде NotificationCenter или делегировать, чтобы отправить сообщение из ваших сцен в ваш ViewController, чтобы показать объявление. Это не самая лучшая практика для ссылки на ваш ViewController в вашем SKScenes.

Так переместить все рекламный код ViewController и чем в GameViewController за пределами реализации класса создать расширение для уведомления ключа

extension Notification.Name { 
     static let showAd = Notification.Name(rawValue: "NotificationShowAd") 
} 

    class GameViewController: UIViewController {... 

чем в GameViewController в ViewDidLoad вы можете добавить наблюдатель

override func viewDidLoad() { 
    super.viewDidLoad() 

     createAndLoadInterstitial() 

     NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: .showAd, object: nil) 

     .... 
} 

Теперь, когда вам нужно показывать объявление из любого вашего SKScenes, вы можете позвонить по этому телефону

NotificationCenter.default.post(name: .showAd, object: nil) 

Чтобы сделать вашу жизнь еще проще взглянуть на мой помощник на GitHub

https://github.com/crashoverride777/SwiftyAds

надеюсь, что это помогает