2015-12-21 7 views
8

Powtórzyłem wersję iAdSuite with Storyboards w trybie szybkim, a program iD działa poprawnie na wszystkich kontrolerach widoku, z tym że po wywołaniu metody delegowania bannerViewDidLoadAd(banner: ADBannerView!) widok banera nie pojawia się natychmiast. Muszę albo obrócić symulator, albo przejść do innej zakładki, żeby się pojawiła.Funkcja iAd nie jest wyświetlana asynchronicznie, gdy jej metoda delegata nazywa się

myślę, że to jest część Apple przykładowy kod w Objective-C, że nie mogę „przetłumaczyć” SWIFT? co może być przyczyną dobrze iAd nie pokazują asynchronicznie po załadowaniu ...

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

To mój BannerViewManager klasa z metodami 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

udało mi się przekształcić kod Objective-C powyżej szybkich wykorzystaniem this post on SO ale nadal mam ten sam problem. IAd nie pojawia się po załadowaniu. Musi być jakieś zmiany do widoku tak, że to robi, albo urządzenie obraca lub dotykając inną kartę, itd ...

Więc teraz moje sharedInstance wygląda następująco:

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

Ja zakładając, że masz jakiś kod IAD w każdy kontroler widoku za 'viewDidLoad'? Jeśli tak, przenieś kod iAd do "viewWillAppear" każdego kontrolera widoku. –

+1

Zrobiłem to tak jak kod przykładowy. Tak więc nie ma kodu iAd w żadnym kontrolerze widoku. Alternatywnie istnieje 'BannerViewController' w widoku kontenera i mam ten wiersz' view.addSubview (BannerViewManager.sharedInstance.bannerView) 'w' viewWillAppear' –

+0

@DanielStorm - kasy przykładowy kod dla 'tabbedBanner' [tutaj] (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) –

Odpowiedz

2

myślę zorientowali się, na czym polega problem. Nie ma to nic wspólnego ze sposobem inicjowania współużytkowanej instancji klasy BannerViewManager. W rzeczywistości okazało się, że daje dokładnie to samo zachowanie, czy przy użyciu dispatch_once lub nowy sposób Swift 2.0.

Rzeczą, która spowodowała, że ​​iAd nie pojawił się natychmiast po wywołaniu bannerViewDidLoadAd jest to, że viewDidLayoutSubviews nigdy nie było wywoływane!

Musiałem dodać tu i tam pewne instrukcje drukowania. Zarówno w moim kodzie, jak i przykładowym kodzie Apple, aby dojść do tego wniosku.

setNeedsLayout Więc zamiast layoutIfNeeded przymusowej wyzwalania viewDidLayoutSubviews

0
  1. Ogólnie dołączyć punkty przerwania w bannerViewDidLoadAd i podobnych funkcji zwrotnej.
  2. Sprawdź czy masz delegata jak w SWIFT jako klasy YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Sprawdź swój scenariusz, powiedział: „Muszę albo obrócić symulator lub przejść na inną kartę tak, że wydaje się”, więc metoda, która ewentualnie może być za to odpowiedzialny. Wiem, że to zgadłeś.
  4. READ Docs, Analyze.
Powiązane problemy