2015-12-21 3 views
8

Я скопировал iAdSuite with Storyboards в swift, и iAd отлично работает во всех контроллерах представлений, за исключением того, что когда метод делегата bannerViewDidLoadAd(banner: ADBannerView!) называется видом баннера, он не отображается мгновенно. Мне нужно либо повернуть симулятор, либо перейти на другую вкладку, чтобы она появилась.iAd не отображается асинхронно после вызова метода делегата

Я думаю, что это часть образцового кода Apple в Objective-C, который я не мог «перевести» на быстрый? которые вполне могут быть причиной ОВР не показывать асинхронно после загрузки ...

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

Это мой BannerViewManager класс с ADBannerViewDelegate методами.

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

мне удалось преобразовать код Objective-C выше быстрым использованием this post on SO, но я до сих пор с той же проблемой. IAd не появляется после его загрузки. Там должен быть какой-то изменения в представлении, так что он делает, или поворотное устройство или нажав другую вкладку, и т.д. ...

Так что теперь мой sharedInstance выглядит следующим образом:

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

Я предполагаю, что у вас есть код iAd в каждом представлении контроллера 'viewDidLoad'? Если это так, переместите код iAd в каждый вид контроллера 'viewWillAppear'. –

+1

Я сделал это полностью, как пример кода. Таким образом, в любом контроллере представления нет iAd-кода. Кроме того, в представлении контейнера есть «BannerViewController», и у меня есть эта строка 'view.addSubview (BannerViewManager.sharedInstance.bannerView)' в его 'viewWillAppear' –

+0

@DanielStorm - Оформить образец кода для' tabbedBanner' [здесь] (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) –

ответ

2

Я думаю, выяснил, в чем проблема. Это не имеет никакого отношения к тому, как я инициализирую общий экземпляр класса BannerViewManager. На самом деле оказалось, что он дает точно такое же поведение, используя dispatch_once или новый быстрый способ 2.0.

Дело в том, что iAd не отображалось мгновенно при вызове bannerViewDidLoadAd, так как viewDidLayoutSubviews на самом деле никогда не вызывался!

Мне пришлось добавить некоторые заявления о печати здесь и там. Как в моем коде, так и в примере кода Apple, чтобы прийти к такому выводу.

setNeedsLayout Так вместо принудительного layoutIfNeeded курок viewDidLayoutSubviews

0
  1. В общем, прикрепить контрольные точки в bannerViewDidLoadAd и ту же функцию обратного вызова.
  2. Проверьте, что у вас есть делегат, как в swift как класс YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Проверьте свой сценарий, вы сказали: «Мне нужно либо повернуть симулятор, либо перейти на другую вкладку, чтобы он появился», поэтому какой способ может быть ответственным за это. Я знаю, вы догадались.
  4. READ Docs, Analyze.