2015-12-21 11 views
8

Ho replicato lo iAdSuite with Storyboards in rapido e l'iAd funziona perfettamente su tutti i controller di visualizzazione, tranne che quando il metodo delegato bannerViewDidLoadAd(banner: ADBannerView!) viene chiamato la visualizzazione banner non viene visualizzata all'istante. Devo ruotare il simulatore o andare in un'altra scheda in modo che appaia.iAd non viene visualizzato in modo asincrono una volta chiamato il suo metodo delegato

Penso che questa sia la parte del codice di esempio Apple in Objective-C che non potevo "tradurre" in swift? che potrebbe essere la causa del iAd non mostra in modo asincrono una volta caricato ...

+ (BannerViewManager *)sharedInstance 
{ 
    static BannerViewManager *sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[BannerViewManager alloc] init]; 
    }); 
    return sharedInstance; 
} 

Questa è la mia classe BannerViewManager con i ADBannerViewDelegate metodi.

class BannerViewManager: NSObject, ADBannerViewDelegate { 

    // MARK: - Shared instance 
    static let sharedInstance = BannerViewManager() 

    var bannerView: ADBannerView! 
    var bannerViewControllers: NSMutableSet! 

    override init() { 
     super.init() 

     bannerView = ADBannerView(adType: .Banner) 
     bannerViewControllers = NSMutableSet() 
     bannerView.delegate = self 
    } 

    func addBannerViewController(controller: BannerViewController) { 
     bannerViewControllers.addObject(controller) 
    } 

    func removeBannerViewController(controller: BannerViewController) { 
     bannerViewControllers.removeObject(controller) 
    } 

    // MARK: - Ad banner view delegate methods 

    func bannerViewDidLoadAd(banner: ADBannerView!) { 
     NSLog("bannerViewDidLoadAd") 

     for bannerViewController in bannerViewControllers { 
      (bannerViewController as! BannerViewController).updateLayout() 
     } 
    } 

    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { 
     NSLog("didFailToReceiveAdWithError %@", error); 

     for bannerViewController in bannerViewControllers { 
      (bannerViewController as! BannerViewController).updateLayout() 
     } 
    } 

    func bannerViewActionShouldBegin(banner: ADBannerView!, willLeaveApplication willLeave: Bool) -> Bool { 
     NSNotificationCenter.defaultCenter().postNotificationName(BannerViewActionWillBegin, object: self) 
     return true 
    } 

    func bannerViewActionDidFinish(banner: ADBannerView!) { 
     NSNotificationCenter.defaultCenter().postNotificationName(BannerViewActionDidFinish, object: self) 
    } 
} 

EDIT

sono riuscito a convertire il codice Objective-C al di sopra di rapida utilizzando this post on SO ma ho ancora lo stesso problema. L'iAd non appare una volta caricato. Ci deve essere una sorta di cambiamento per la vista in modo che lo fa, o dispositivo rotante o toccando un'altra scheda, ecc ...

Così ora il mio sharedInstance assomiglia a questo:

static var sharedInstance: BannerViewManager { 
     struct Static { 
      static var onceToken: dispatch_once_t = 0 
      static var instance: BannerViewManager? = nil 
     } 
     dispatch_once(&Static.onceToken) { 
      Static.instance = BannerViewManager() 
     } 
     return Static.instance! 
    } 
+1

Suppongo che tu abbia del codice iAd in 'viewDidLoad' di ciascun controller? In tal caso, sposta il codice iAd in 'viewWillAppear 'di ogni view. –

+1

L'ho fatto fino in fondo come il codice di esempio. Quindi non esiste un codice iAd in nessun controller di visualizzazione. In alternativa c'è un 'BannerViewController' in una vista container e ho questa riga' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'nel suo' viewWillAppear' –

+0

@DanielStorm - Controlla il codice di esempio per 'tabbedBanner' [qui] (https://developer.apple.com/library/ios/samplecode/iAdSuite_Storyboard/Listings/TabbedBanner_TabbedBanner_BannerViewController_m.html#//apple_ref/doc/uid/DTS40013458-TabbedBanner_TabbedBanner_BannerViewController_m-DontLinkElementID_34) –

risposta

2

Credo capito qual è il problema Non ha nulla a che fare con il modo in cui inizializzo l'istanza condivisa della classe BannerViewManager. In effetti, si è rivelato che ha fornito esattamente lo stesso comportamento sia usando dispatch_once sia con il nuovo modo rapido di 2.0.

La cosa che ha causato la visualizzazione istantanea di iAd quando è stato richiamato bannerViewDidLoadAd è che non è mai stato chiamato viewDidLayoutSubviews!

Ho dovuto aggiungere alcune dichiarazioni di stampa qua e là. Sia nel mio codice che nel codice di esempio Apple per raggiungere questa conclusione.

Così, invece di setNeedsLayoutlayoutIfNeeded grilletto costretto la viewDidLayoutSubviews

0
  1. In generale, collegare i punti di interruzione in bannerViewDidLoadAd, e funzione di callback simili.
  2. Verificare di avere il delegato in modo rapido come classe YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Controlla il tuo scenario, hai detto "Devo ruotare il simulatore o andare in un'altra scheda in modo che appaia", quindi quale metodo potrebbe esserne responsabile. So che lo hai indovinato.
  4. LEGGI Documenti, Analizza.