Конечно, это будет работать, но единственная проблема заключается в том, что когда вы обновляете делегата для объявления, он фактически не заберет нового делегата для объявления, если вы явно не сделаете новый запрос объявления, поэтому ваши старые представления будут получать любые уведомления от рекламы. Я бы порекомендовал подход к созданию синглтона 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];
}