Один экземпляр AdMod во всех ViewController

Я хочу использовать AdMob в своем приложении, и у меня есть 4 viewController (в 4 элементах вкладок), где я хочу сделать его видимым. Как показывает пример, каждый ViewController должен создать его экземпляр и добавить в качестве подпредставления.

Я все еще думаю, можно ли каким-то образом использовать только 1 экземпляр, который можно использовать во всех приложениях. Как я могу это сделать?

Если я создам 1 экземпляр в AppDelegate как autorelease и сохраню в каждом viewController, а в viewDidUnload выпущу его, а затем в следующем элементе вкладки (viewController) я снова сохраню его и т. д... это хороший подход?


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


Ответы (3)


Подход AppDelegate — хороший подход, но вы не должны сохранять экземпляр admob в каждом контроллере представления и выпускать его в методе viewDidUnload. Вместо этого просто добавьте представление admob в метод viewDidLoad каждого контроллера представления в качестве подпредставления. Таким образом, в AppDelegate будет только один экземпляр представления Admob.

Надеюсь, это поможет вам.

person Atulkumar V. Jain    schedule 14.03.2012
comment
Вы не можете добавить одно представление в качестве подпредставления к нескольким представлениям. - person beryllium; 14.03.2012

Конечно, это будет работать, но единственная проблема заключается в том, что когда вы обновляете делегата для объявления, он фактически не подберет новый делегат для объявления, если вы явно не сделаете новый запрос объявления, поэтому ваши старые представления будут получать любые уведомления. из объявления. Я бы порекомендовал подход создания синглтона AdMob, который затем перенаправляет любые уведомления делегата в правильное представление.

Поэтому создайте класс с именем 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 ViewController) вы можете просто добавить его в свою иерархию представлений, используя:

- (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 из ВК через appDelegate

person beryllium    schedule 14.03.2012