Xcode 通过UITableView跨应用程序使用ADBannerView的共享实例
我有一个具有多个UITableView的应用程序,我正在实施iADs。根据Apple文档(),我创建了一个属于我的应用程序代理的共享横幅,应用程序代理也是横幅的代理。这很有效,在加载横幅和用户切换屏幕后,广告在各个视图控制器上都能很好地显示出来 问题是,在出现的第一个viewController上看不到广告,因为视图控制器的ViweWillAspect方法(我称之为“fixUpAdView”方法)在加载横幅之前出现 我想我没有得到的部分是(来自苹果的文档): “让您的应用程序代理告诉当前视图控制器是否应显示或隐藏标题。您可以使用UINavigationControllerDelegate或UITabBarControllerDelegate协议推送标题以显示标题。”我知道我需要在我的BannerViewIDLoad和failToReceive方法中添加一些东西,但对于如何做到这一点,我有点困惑 我不希望广告显示在我所有的视图控制器上(只有6个),我在应用程序中也有几个模式视图(其中任何一个都没有广告) 以下是我的一些代码: 在我的appDelegate中:Xcode 通过UITableView跨应用程序使用ADBannerView的共享实例,xcode,singleton,uitableview,uiapplicationdelegate,adbannerview,Xcode,Singleton,Uitableview,Uiapplicationdelegate,Adbannerview,我有一个具有多个UITableView的应用程序,我正在实施iADs。根据Apple文档(),我创建了一个属于我的应用程序代理的共享横幅,应用程序代理也是横幅的代理。这很有效,在加载横幅和用户切换屏幕后,广告在各个视图控制器上都能很好地显示出来 问题是,在出现的第一个viewController上看不到广告,因为视图控制器的ViweWillAspect方法(我称之为“fixUpAdView”方法)在加载横幅之前出现 我想我没有得到的部分是(来自苹果的文档): “让您的应用程序代理告诉当前视图控制
- (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];
}
}
使用NSNotificationCenter解决这个问题非常有效,现在我的IAD一加载就出现了-耶!如果有其他人需要,这里是我输入的额外代码: (在我的appDelegate.m中) } { } 在我的视图控制器中(在视图中将出现):
我自己也一直在努力解决这个问题,这个问题和其他许多答案都非常有帮助。然而,它们似乎都依赖于与AppDelegate交互的someViewController.m代码,这似乎是错误的 我的解决方案是让应用程序代理将adBannerView对象传递给SubViewController,如下所示:
- (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是否会出现问题?我正在考虑使用通知中心来处理此问题-有什么想法吗?您是否使用UITableViewController?
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
NSLog(@"BannerAd didfailtoreceive");
if (_adBannerViewIsVisible) {
_adBannerViewIsVisible = NO;
[[NSNotificationCenter defaultCenter] postNotificationName:@"adjustAdBannerView" object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(fixupAdView)
name:@"adjustAdBannerView"
object:nil];
- (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];
}
}