Единичен екземпляр на AdMod във всички ViewControllers

Искам да използвам AdMob в приложението си и имам 4 viewControllers (в 4 елемента в раздела), където искам да го направя видим. Както показва примерът, всеки ViewController трябва да направи екземпляр от него и да добави като подизглед.

Все още мисля дали може да има някакъв начин да използвам само 1 екземпляр, който може да се използва във всички приложения. Как мога да направя това?

Ако създам 1 екземпляр в AppDelegate като autorelease и запазя във всеки viewController и при viewDidUnload го освободя и след това в следващия елемент от раздела (viewController) отново го запазя и т.н... добър подход ли е?


person Anand    schedule 14.03.2012    source източник


Отговори (3)


Подходът AppDelegate е хубав подход, но не трябва да запазвате екземпляра на admob във всеки контролер на изгледа и да го освобождавате в метода viewDidUnload. Вместо да правите това, просто добавете изгледа на admob във всеки метод viewDidLoad на viewcontroller като подизглед. По този начин ще има само един екземпляр на изгледа на Admob в AppDelegate.

Надявам се това да ви помогне.

person Atulkumar V. Jain    schedule 14.03.2012
comment
Не можете да добавите един изглед като подизглед към множество изгледи. - person beryllium; 14.03.2012

Разбира се, това би проработило, но единственият проблем е, че когато актуализирате делегата за рекламата, той всъщност няма да вземе новия делегат за рекламата, освен ако изрично не направите нова заявка за реклама, така че старите ви изгледи ще получават всякакви известия от рекламата. Бих препоръчал подхода за създаване на adMob singleton, който след това препраща всички известия за делегат към правилния изглед.

Така че създавате клас, наречен GADMasterViewController (уверете се, че следва и протокола GADBannerViewDelegate) или нещо, което има статичен инициализатор, както следва:

+(GADMasterViewController *)singleton {
  static dispatch_once_t pred;
  static GADMasterViewController *shared = nil;
  dispatch_once(&pred, ^{
    shared = [[GADMasterViewController alloc] init];
  });
  return shared;
}

След това в инициализатора можете да инициализирате един GADBannerView като свойство на този сингълтон:

-(id)init
{
  if (self = [super init])
  {
    self.adBanner = [[GADBannerView alloc]
                     initWithFrame:CGRectMake(0.0,
                                              0.0,
                                              GAD_SIZE_320x50.width,
                                              GAD_SIZE_320x50.height)];

    // Has an ad request already been made
    self.isLoaded = NO;
  }
  return self;
}

След това можете да имате метод, който задава вашия нов adView като currentDelegate като такъв:

-(void)resetAdView:(UIViewController<GADBannerViewDelegate> *)rootViewController {

  if (self.isLoaded) {
     currentDelegate_ = rootViewController;
    [rootViewController.view addSubview:self.adBanner];
  }
  else {
    // The delegate to forward any notifications too
    currentDelegate_ = rootViewController;

    self.adBanner.delegate = self;
    self.adBanner.rootViewController = rootViewController;
    self.adBanner.adUnitID = kSampleAdUnitID;

    GADRequest *request = [GADRequest request];

    [self.adBanner loadRequest:request];
    [rootViewController.view addSubview:self.adBanner];
    self.isLoaded = YES;
  }
}

В този момент просто искате да препратите всички известия, които получите, към правилния viewController, така че един пример би бил:

- (void)adViewDidReceiveAd:(GADBannerView *)view {
  if ([currentDelegate_ respondsToSelector:@selector(adViewDidReceiveAd:)]) {
    [currentDelegate_ adViewDidReceiveAd:view];
  }
}

В ViewControllerX (един от вашите 4 ViewControllers), можете просто да го добавите към вашата йерархия на изгледи, като използвате:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    shared = [GADMasterViewController singleton];
    [shared resetAdView:self];
}
person RajPara    schedule 14.03.2012
comment
Благодаря ти, Радж, за чудесния отговор. За всеки, който чете това, можете също да прочетете googleadsdeveloper. blogspot.co.il/2012/04/ - person kernix; 21.09.2012

Можете да декларирате своя admob изглед в appDelegate и да го добавите като подизглед към прозореца. Обърнете се към изгледа на admob от VC чрез appDelegate

person beryllium    schedule 14.03.2012