Использование общего экземпляра ADBannerView в приложении с UITableViews
У меня есть приложение с несколькими UITableView, и я нахожусь в процессе реализации iAD. Согласно документации Apple ( http://developer.apple.com/library/ios/#technotes/tn2286/_index.html#//apple_ref/doc/uid/DTS40011212) я создал общий баннер, который принадлежит моему делегату приложения и делегат приложения также является делегатом баннера. Это хорошо работает, и реклама хорошо отображается на различных контроллерах представления ПОСЛЕ того, как баннер загружен и пользователь переключает экраны.
Проблема в том, что на первом viewController не появляется реклама, потому что метод viweWillAppear контроллера представления (где я вызываю мой метод fixUpAdView) появляется до загрузки баннера.
Я предполагаю, что часть, которую я не получаю, заключается в следующем (из документации Apple): "Попросите представителя вашего приложения сообщить текущему контроллеру представления, должен ли он показать или скрыть баннер. Вы можете использовать протокол UINavigationControllerDelegate или UITabBarControllerDelegate, чтобы выдвинуть баннер, чтобы показать Это." Я понимаю, что мне нужно поместить что-то в мои методы bannerViewDidLoadAd и failToReceive, но я немного запутался в том, как это сделать.
Я не хочу, чтобы объявление показывалось на всех моих контроллерах представления (только 6 из них), и у меня также есть несколько модальных представлений в приложении (нет объявлений ни на одном из них).
Вот часть моего кода: В моем appDelegate:
- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
NSLog(@"bannerViewDidLoadAD");
if (!_adBannerViewIsVisible)
_adBannerViewIsVisible = YES;
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
NSLog(@"BannerAd didfailtoreceive");
if (_adBannerViewIsVisible)
_adBannerViewIsVisible = NO;
}
- (ADBannerView *)sharedAdBannerView
{
if (_sharedAdBannerView == nil) {
Class classAdBannerView = NSClassFromString(@"ADBannerView");
if (classAdBannerView != nil) {
_sharedAdBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
[_sharedAdBannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects:
ADBannerContentSizeIdentifier320x50,
ADBannerContentSizeIdentifier480x32, nil]];
[_sharedAdBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];
[_sharedAdBannerView setFrame:CGRectOffset([_sharedAdBannerView frame], 0,
-(iAD_BANNER_HEIGHT))];
[_sharedAdBannerView setDelegate:self];
}
}
return _sharedAdBannerView;
}
На мой взгляд контроллер:
- (void)viewWillAppear:(BOOL)animated {
if ([[AppDelegate ad] shouldShowAds]) {
if (!self.contentView) {
self.contentView = [[UIView alloc] initWithFrame:[[self view] bounds]];
[self.view addSubview:_contentView];
}
[self.contentView addSubview:topView];
[self fixupAdView];
[self.view addSubview:[[AppDelegate ad] sharedAdBannerView]];
}
[super viewWillAppear:NO];
}
#pragma mark
#pragma mark iADS
- (void)fixupAdView {
if ([[AppDelegate ad] sharedAdBannerView] != nil) {
[[[AppDelegate ad] sharedAdBannerView] setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];
[UIView beginAnimations:@"fixupViews" context:nil];
if ([[AppDelegate ad] adBannerViewIsVisible]) {
CGRect adBannerViewFrame = [[[AppDelegate ad] sharedAdBannerView] frame];
adBannerViewFrame.origin.x = 0;
adBannerViewFrame.origin.y = 0;
[[[AppDelegate ad] sharedAdBannerView] setFrame:adBannerViewFrame];
CGRect contentViewFrame = _contentView.frame;
contentViewFrame.origin.y = iAD_BANNER_HEIGHT;
contentViewFrame.size.height = self.view.frame.size.height -
iAD_BANNER_HEIGHT;
_contentView.frame = contentViewFrame;
}
else {
CGRect adBannerViewFrame = [[[AppDelegate ad] sharedAdBannerView] frame];
adBannerViewFrame.origin.x = 0;
adBannerViewFrame.origin.y = -(iAD_BANNER_HEIGHT);
[[[AppDelegate ad] sharedAdBannerView] setFrame:adBannerViewFrame];
CGRect contentViewFrame = _contentView.frame;
contentViewFrame.origin.y = 0;
contentViewFrame.size.height = self.view.frame.size.height;
_contentView.frame = contentViewFrame;
}
[UIView commitAnimations];
}
}
2 ответа
Использование NSNotificationCenter для решения этой проблемы работало как чудо, и теперь мои iAds появляются, как только они загружены - ура! Если кому-то еще это нужно, вот дополнительный код, который я ввожу: (в моем appDelegate.m)
- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
NSLog(@"bannerViewDidLoadAD");
if (!_adBannerViewIsVisible) {
_adBannerViewIsVisible = YES;
[[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
NSLog(@"BannerAd didfailtoreceive");
if (_adBannerViewIsVisible) {
_adBannerViewIsVisible = NO;
[[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}
}
и в моем View Controller (в viewWillAppear):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(fixupAdView)
name:@"adjustAdBannerView"
object:nil];
Я боролся с этим сам, и этот и многие другие ответы были очень полезны. Однако все они, похоже, передают код someViewController.m, взаимодействующий с AppDelegate, что кажется неправильным.
Мое решение состоит в том, чтобы делегат приложения передавал объект adBannerView в subViewControllers следующим образом:
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
if (VERBOSE) NSLog(@"sharedAdBannerView %@ failed with error: %@", banner, error);
if (self.adBannerIsVisible)
{
[someViewController setAdBannerViewIsVisible:NO];
[someViewController setAdBannerView:nil];
[otherViewController setAdBannerViewIsVisible:NO];
[otherViewController setAdBannerView:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}
}
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
if (VERBOSE) NSLog(@"sharedAdBannerView %@ loaded", banner);
if (!self.adBannerIsVisible)
{
[someViewController setAdBannerViewIsVisible:YES];
[someViewController setAdBannerView:sharedAdBannerView];
[otherViewController setAdBannerViewIsVisible:YES];
[otherViewController setAdBannerView:sharedAdBannerView];
[[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}
}
А потом someViewController
может иметь код, чтобы показать или удалить adBannerView
объект из поля зрения
Будут ли проблемы с тем, что один и тот же AdBannerView используется в нескольких разных представлениях?