2015-12-21 11 views
8

Ich habe die iAdSuite with Storyboards in Swift repliziert, und die iAd funktioniert über alle View-Controller ordnungsgemäß, außer, wenn die Delegate-Methode bannerViewDidLoadAd(banner: ADBannerView!) aufgerufen wird, wird die Banneransicht nicht sofort angezeigt. Ich muss entweder den Simulator drehen oder zu einem anderen Tab gehen, damit er erscheint.iAd wird nicht asynchron angezeigt, sobald seine Delegate-Methode aufgerufen wird

Ich denke, das der Teil des Apple-Beispielcode in Objective-C ist, dass ich nicht zu swift „übersetzen“ könnte? die gut verursachen können die iAd zeigen nicht asynchron einmal geladen ...

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

Das ist mein BannerViewManager Klasse mit den ADBannerViewDelegate Methoden.

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

Ich habe es geschafft, die Objective-C-Code über rasche this post on SO zu konvertieren, aber ich habe immer noch das gleiche Problem mit. Das iAd erscheint nicht sobald es geladen ist. Es muss eine Art von Veränderung so zu der Ansicht sein, dass es der Fall ist, entweder Drehvorrichtung oder ein anderes Register tippen, etc ...

So jetzt meine sharedInstance wie folgt aussieht:

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

Ich nehme an, Sie in jeder Ansicht Controller 'viewDidLoad' einige iAd-Code? Wenn dies der Fall ist, verschieben Sie den iAd-Code in den ViewWillAppear jedes View-Controllers. –

+1

Ich habe das den ganzen Weg wie der Beispielcode getan. Es gibt also keinen iAd-Code in einem View-Controller. Alternativ gibt es ein 'BannerViewController' in einem Container Ansicht ist, und ich habe diese Linie bekommt' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'in seinem' viewWillAppear' –

+0

@DanielStorm - Kasse den Beispielcode für 'tabbedBanner' [hier] (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) –

Antwort

2

Ich glaube, ich herausgefunden, was das Problem ist. Es hat nichts damit zu tun, wie ich die geteilte Instanz der Klasse BannerViewManager initialisiere. In der Tat stellte sich heraus, genau dasselbe Verhalten zu geben, ob dispatch_once oder die neue Swift 2.0 Weg verwenden.

Die Sache, die die iAd nicht sofort angezeigt, wenn bannerViewDidLoadAd aufgerufen wurde, ist, dass viewDidLayoutSubviews wurde eigentlich nie aufgerufen!

Ich musste hier und da einige Druckanweisungen hinzufügen. Sowohl in meinem Code als auch im Apple-Beispielcode erreichen Sie diese Schlussfolgerung.

So setNeedsLayout statt layoutIfNeeded gezwungen Auslöser der viewDidLayoutSubviews

0
  1. Im Allgemeinen legen die Haltepunkte in bannerViewDidLoadAd und ähnliche Callback-Funktion.
  2. Überprüfen Sie, haben Sie die Delegierten wie in swift als Klasse YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Überprüfen Sie Ihr Szenario, Sie sagten "Ich muss entweder den Simulator drehen oder zu einem anderen Tab gehen, so dass es erscheint", also welche Methode möglicherweise dafür verantwortlich sein könnte. Ich weiß, du hast es erraten.
  4. LESEN Dokumente, Analyse.
Verwandte Themen