iAd не се показва асинхронно, след като неговият метод на делегиране бъде извикан

Копирах iAdSuite с Storyboards в swift и iAd работи добре във всички контролери за изглед, с изключение на това, че когато се извика методът на делегиране bannerViewDidLoadAd(banner: ADBannerView!), изгледът на банер не се появява незабавно. Трябва или да завъртя симулатора, или да отида в друг раздел, за да се появи.

Мисля, че това е частта от примерния код на Apple в Objective-C, която не можах да „преведа“ на swift? което може да е причината iAd да не се показва асинхронно след зареждане...

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

РЕДАКТИРАНЕ

Успях да преобразувам обективния C код по-горе в swift с помощта на тази публикация в 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!
    }

person Ahmed Khedr    schedule 21.12.2015    source източник
comment
Предполагам, че имате някакъв iAd код във всеки контролер за изглед viewDidLoad? Ако е така, преместете кода на iAd към viewWillAppear на всеки контролер за преглед.   -  person Daniel Storm    schedule 21.12.2015
comment
Направих това докрай като примерния код. Така че няма iAd код в нито един изглед контролер. Като алтернатива има BannerViewController в изглед на контейнер и имам този ред view.addSubview(BannerViewManager.sharedInstance.bannerView) в неговия viewWillAppear   -  person Ahmed Khedr    schedule 21.12.2015
comment
@DanielStorm – Вижте примерния код за tabbedBanner тук   -  person Ahmed Khedr    schedule 21.12.2015


Отговори (2)


Мисля, че разбрах какъв е проблемът. Няма нищо общо с начина, по който инициализирам споделения екземпляр на класа BannerViewManager. Всъщност се оказа, че дава абсолютно същото поведение, независимо дали използва dispatch_once или новия начин swift 2.0.

Нещото, което накара iAd да не се покаже мигновено, когато bannerViewDidLoadAd беше извикано, е, че viewDidLayoutSubviews всъщност никога не беше извикано!

Трябваше да добавя някои изявления за печат тук и там. Както в моя код, така и в примерния код на Apple, за да стигна до това заключение.

Така че setNeedsLayout вместо layoutIfNeeded принудително задейства viewDidLayoutSubviews

person Ahmed Khedr    schedule 25.12.2015

  1. Като цяло прикачете точките на прекъсване в bannerViewDidLoadAd и подобна функция за обратно извикване.
  2. Проверете дали имате делегата като в swift като клас YourClassViewController: UIViewController, ADBannerViewDelegate.
  3. Проверете вашия сценарий, казахте „Трябва или да завъртя симулатора, или да отида в друг раздел, за да се появи“, така че кой метод може да е отговорен за това. Знам, че се досетихте.
  4. ЧЕТЕТЕ Документи, Анализирайте.
person Kumar Utsav    schedule 30.12.2015