2017-07-15 2 views
0

J'ai une application qui a Game Center Classements, et une bannière Admob inclus. Les publicités sont en ligne et quand je lance l'application sur un appareil réel via Xcode 8, il fonctionne bien. Mais quand je lance un émulateur de Xcode 8 les charges d'application, mais après quelques secondes, j'ai l'erreur:Terminer l'application en raison d'une exception non interceptée NSInvalidArgumentException

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
     reason: 'Application tried to present modal view controller on itself. Presenting controller is <GKHostedAuthenticateViewController: 0x7f818d749310>.' 

Je suis actuellement en place mon bandeau publicitaire dans mon contrôleur de vue comme ceci:

mybanner.adUnitID = "XXX"; 
    super.viewDidLoad(); 

    mybanner.rootViewController = self; 
    mybanner.delegate = self; 
    let request = GADRequest(); 
    mybanner.load(request); 

    //view.addConstraint(NSLayoutConstraint(item: mybanner, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)); 
    //view.addConstraint(NSLayoutConstraint(item: mybanner, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0)); 

    NotificationCenter.default.addObserver(self, selector: #selector(self.showBannerAd), name: NSNotification.Name(rawValue: "showbannerad"), object: nil); 
    NotificationCenter.default.addObserver(self, selector: #selector(self.hideBannerAd), name: NSNotification.Name(rawValue: "hidebannerad"), object: nil); 

et d'appeler les notifications pour afficher/masquer la bannière des classes de scène comme suit:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "showbannerad"), object: nil); 

Je suis mon objet du jeu Initialisation Centre dans sa propre classe et appelant sa méthode d'initialisation de th e écran de démarrage init pour le contrôleur Game Center est la suivante:

func authPlayer(scene: SKScene) { 
    let localPlayer = GKLocalPlayer.localPlayer(); 

    localPlayer.authenticateHandler = { 
     (view, error) in 
     if view != nil { 
      view!.present(view!, animated: true, completion: nil); 
     }else { 
      print(GKLocalPlayer.localPlayer().isAuthenticated); 
     } 
    } 
} 

    /// In the GamvViewController 
    func showBannerAd() { 
    if mybanner.isHidden == true { 
     mybanner.isHidden = false; 
    } 
} 

Son étrange que cela fonctionne sur un périphérique réel, mais pas dans un émulateur. Si vous souhaitez plus de détails faites le moi savoir. Merci.

+2

qu'est-ce que 'mybanner'? pourquoi vous l'avez défini comme rootViewController? il semble que ce soit le problème ici. – Codus

+1

Montrez les 'funcs' que vous appelez avec vos notifications. –

+0

Ma bannière est une bannière Admob. Et c'est dans la classe GameViewController. –

Répondre

2

Dans localPlayer.authenticateHandler, il y a une vue, quelle est la classe? Est-ce GKHostedAuthenticateViewController? .Si c'est le cas, c'est le problème. Le message d'erreur est clair, certains appel ViewController le présent lui-même.