2016-06-10 1 views
2

Я работаю с SDK Google Mobile Ads на iOS и пытаюсь отобразить некоторые объявления. Мой код:GADBannerView методы делегата не вызываются, если представление отсутствует в иерархии представлений

GADBannerView* bannerView = [[GADBannerView alloc] initWithAdSize:GADAdSizeFromCGSize(CGSizeMake(300, 250))]; 
bannerView.adUnitID = @"hidden"; 
bannerView.rootViewController = self; 
bannerView.delegate = self; 

GADRequest* request = [GADRequest request]; 
request.testDevices = @[ kGADSimulatorID ]; 

[bannerView loadRequest:request]; 

Это прекрасно работает, если я добавляю bannerView в иерархии представлений сразу после кода, который вы видите выше. Тем не менее, я не хочу добавлять его до тех пор, пока объявление не будет загружено, поэтому я хотел его задержать. Я заметил, что если bannerView не находится в иерархии представлений, методы делегата вообще не вызываются. Кроме того, я нашел this answer, что соответствует тому, что я наблюдаю. С другой стороны, это цитата из заголовка GADBannerViewDelegate:

/// Tells the delegate that an ad request successfully received an ad. The delegate may want to add 
/// the banner view to the view hierarchy if it hasn't been added yet. 
- (void)adViewDidReceiveAd:(GADBannerView *)bannerView; 

Это говорит о том, что она должна быть возможность получить эти делегат обратного вызова, даже если вид не в иерархии, что это именно то, что я хочу. Итак, какие-то идеи, как я мог достичь этого?

+0

Вы добавили 'GADBannerViewDelegate' в свой' ViewController', правильно? Например, '@interface ViewController() '. –

+1

@ Даниэль Да, я объявил, что мой контроллер просмотра реализует протокол, и я не получаю никаких предупреждений. – lawicko

ответ

5

Хорошо, проблема в том, что я не сохранил ссылку на bannerView. Он был освобожден после возврата метода, и поэтому методы делегата не вызывались.

0

Вам необходимо добавить GADBannerView к вашему мнению и установить его скрытое свойство в YES изначально. Кроме того, я бы предложил использовать AdSize Constant kGADAdSizeBanner, который предоставляет AdMob. Вот список дополнительных AdSize Constants.

Например:

bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; 
bannerView.adUnitID = @"YourAdUnitID"; 
bannerView.rootViewController = self; 
bannerView.delegate = self; 
[bannerView loadRequest:[GADRequest request]]; 
bannerView.hidden = YES; // Hide banner initially 
[self.view addSubview:bannerView]; 
// This will put the banner at the bottom of the screen and stretch to fit the screens width 
[bannerView setFrame:CGRectMake(0, self.view.frame.size.height - bannerView.frame.size.height, self.view.frame.size.width, bannerView.frame.size.height)]; 

Затем, когда вы получите объявление вы отобразите знамя. Например:

-(void)adViewDidReceiveAd:(GADBannerView *)adView { 
    // We've received an ad so lets show the banner 
    bannerView.hidden = NO; 
    NSLog(@"adViewDidReceiveAd"); 
} 

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error { 
    // Failed to receive an ad from AdMob so lets hide the banner 
    bannerView.hidden = YES; 
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]); 
} 

Вы также можете анимировать это, если вы предпочитаете, установив alpha свойство баннера в 0.0 первоначально вместо того, чтобы использовать это свойство hidden. Затем анимируйте alpha, когда вы получите объявление. Например:

-(void)adViewDidReceiveAd:(GADBannerView *)adView { 
    // We've received an ad so lets fade in the banner 
    [UIView animateWithDuration:0.2 animations:^{ 
     bannerView.alpha = 1.0; 
    }]; 
    NSLog(@"adViewDidReceiveAd"); 
} 

-(void)adView:(GADBannerView *)adView didFailToReceiveAdWithError:(GADRequestError *)error { 
    // Failed to receive an ad from AdMob so lets fade out the banner 
    [UIView animateWithDuration:0.2 animations:^{ 
     bannerView.alpha = 0.0; 
    }]; 
    NSLog(@"adView:didFailToReceiveAdWithError: %@", [error localizedDescription]); 
} 

Кроме того, в качестве примечания, то GADBannerView прозрачен, когда нет объявлений для отображения. Таким образом, добавив его в свое мнение и ничего не сделав, это тоже сработает.

+0

Спасибо за ответ, но я не хочу добавлять представление в иерархию, на самом деле я хочу избежать его любой ценой, потому что этот баннер является ячейкой в ​​представлении коллекции, поэтому, если он не загружен, m не интересуется им. Кроме того, размер определяется как 300x250, поэтому константы размера бесполезны для меня. 300x250, или так называемый средний прямоугольник, довольно популярны, поэтому я не беспокоюсь о нехватке рекламы для отображения. – lawicko

+0

@ lawicko Мое удовольствие. вы должны изменить свой вопрос, чтобы включить эту информацию. –

+0

Вы упомянули, что сначала в иерархии представлений отображается представление «Должно». В документах SDK четко указано, что вы можете запросить их, прежде чем добавлять их в иерархию. –

Смежные вопросы