2015-12-21 23 views
8

çağrıldığında eşzamansız bir şekilde gösterilmiyor iAdSuite with Storyboards'u hızlı bir şekilde çoğalttım ve iAd tüm görünüm denetleyicilerinde gayet güzel çalışıyor, ancak temsilci yöntemi bannerViewDidLoadAd(banner: ADBannerView!) çağrıldığında, afiş görünümü anında görünmez. Simülatörü döndürmem veya başka bir sekmeye gitmem gerekiyor.iAd, temsilci yöntemine

Bence bu, Objective-C'deki Apple örnek kodunun, hızlıca "çeviremediğim" bir parçası olduğunu düşünüyorum. hangi iyi

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

Bu ADBannerViewDelegate yöntemlerle benim BannerViewManager sınıftır ... iAd kez yüklenen uyumsuz göstermiyor neden oluyor olabilir.

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) 
    } 
} 

DÜZENLEME

Ben this post on SO kullanarak Swift için yukarıdaki amaç-C kodu dönüştürmek başarmış ama hala aynı sorun var. IAd yüklendikten sonra görünmez.

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

Her görünüm denetleyicisinin 'viewDidLoad'ında bazı iAd kodunuzun olduğunu varsayalım? Öyleyse, iAd kodunu her bir denetleyicinin 'viewWillAppear' öğesine taşıyın. –

+1

Bunu örnek kod gibi yaptım. Yani herhangi bir görüntü denetleyicisinde iAd kodu yok. Alternatif olarak kapsayıcı görünümünde bir 'BannerViewController' var ve bu satırı viewviewadgetview (BannerViewManager.sharedInstance.bannerView) '' viewWillAppear' –

+0

@DanielStorm 'da var -' tabbedBanner 'için örnek kodun çıkışını yapın [burada] (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) –

cevap

2

sanırım:

Şimdi sharedInstance şuna benzer benim ki öyle, ya vb cihazı döndürerek veya başka bir sekme dokunarak ... görünümüne değişim çeşit noktası olması lazım sorunun ne olduğunu anladım. BannerViewManager sınıfının paylaşılan örneğini başlatma şeklim ile hiçbir ilgisi yoktur. Nitekim, dispatch_once veya yeni hızlı 2.0 yolunu kullanıp aynı davranışı vermek için ortaya çıktı.

bannerViewDidLoadAd bildirildiğinde iAd'ın gösterilmemesine neden olan şey, viewDidLayoutSubviews'un aslında hiç çağrılmadığıdır!

Burada ve orada bazı baskı ifadeleri eklemek zorunda kaldım. Bu sonuca ulaşmak için hem kodum hem de Apple örnek kodumda.

Yani setNeedsLayout yerine layoutIfNeeded zorla tetik Genelde viewDidLayoutSubviews

0
  1. , bannerViewDidLoadAd kesme noktaları ve benzeri geri çağırma işlevi ekleyin.
  2. Temsilcinizi sınıfta hızlı bir şekilde temsil etmeyi kontrol edin YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Senaryonuzu kontrol et, "Simülatörünü döndürmem ya da görünmesi için başka bir sekmeye gitmem gerekiyor" dedin, hangi yöntemden muhtemelen sorumlu olabilir. Bunu tahmin ettiğini biliyorum.
  4. OKU Dökümanlar, Analiz.