2017-01-31 77 views
0

我已將橫幅視圖集成到我的應用程序中的一個場景中,但我未能將Interstitial廣告集成到另一個場景中。 這裏是我的代碼: 進口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 e.g

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以顯示廣告。在你的SKScenes中引用你的ViewController並不是最好的做法。

所以把所有的廣告代碼到你的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

希望這有助於

相關問題