AdMod один экземпляр во всех ViewControllers - PullRequest
6 голосов
/ 14 марта 2012

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

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

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

Ответы [ 3 ]

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    shared = [GADMasterViewController singleton];
    [shared resetAdView:self];
}
3 голосов
/ 14 марта 2012

Вы можете объявить свой адмоб вид в appDelegate и добавить его как подпредставление к окну. Обратитесь к представлению admob из VC через appDelegate

2 голосов
/ 14 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...