【问题标题】:using shared instance of ADBannerView across app with UITableViews使用 UITableViews 跨应用程序使用 ADBannerView 的共享实例
【发布时间】:2012-05-13 02:19:49
【问题描述】:

我有一个包含多个 UITableView 的应用,并且正在实施 iAD。根据 Apple 文档 (http://developer.apple.com/library/ios/#technotes/tn2286/_index.html#//apple_ref/doc/uid/DTS40011212),我创建了一个属于我的应用程序代表的共享横幅,并且应用程序代表也是横幅的代表。这很有效,并且在加载横幅和用户切换屏幕后,广告在各种视图控制器中很好地展示。

问题是在出现的第一个 viewController 上没有看到广告,因为视图控制器的 viweWillAppear 方法(我在这里调用我的“fixUpAdView”方法)在加载横幅之前出现。

我想我没有得到的部分是这个(来自苹果文档): “让您的应用程序委托告诉当前视图控制器是否应该显示或隐藏横幅。您可以使用 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];
    }   
}

【问题讨论】:

  • 我正在考虑使用通知中心来处理这个问题 - 有什么想法吗?

标签: xcode singleton uitableview uiapplicationdelegate adbannerview


【解决方案1】:

使用 NSNotificationCenter 解决这个问题就像一个魅力,现在我的 iAd 一加载就会出现 - 耶!如果其他人需要这里是我输入的额外代码: (在我的 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];
}

}

在我的视图控制器中(在 viewWillAppear 中):

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(fixupAdView)
                                                 name:@"adjustAdBannerView"
                                               object:nil];

【讨论】:

  • 你在使用 UITableViewController 吗?
【解决方案2】:

我自己一直在努力解决这个问题,这个和许多其他答案都非常有帮助。然而,它们似乎都依赖于与 AppDelegate 交互的 someViewController.m 代码,这似乎是错误的方式。

我的解决方案是让 App Delegate 将 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 会不会有问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多