4

我有多個UITableViews一個應用程序,並在上午執行的iAds的過程。根據Apple文檔(http://developer.apple.com/library/ios/#technotes/tn2286/_index.html#//apple_ref/doc/uid/DTS40011212),我創建了屬於我的應用程序委託的共享橫幅,應用程序委託也是橫幅的代表。這樣做效果很好,在橫幅加載和用戶切換屏幕之後,廣告在各種視圖控制器中很好地顯示。使用共享ADBannerView的實例將通過應用與UITableViews

問題是,由於視圖控制器的viweWillAppear方法(我調用我的「fixUpAdView」方法)出現在加載橫幅之前,沒有在第一個viewController出現的廣告出現。

我想,我沒有得到的是部分本(從蘋果文檔): 「讓你的應用程序委託告知當前視圖控制器是否應該顯示或隱藏廣告可以使用UINavigationControllerDelegate或UITabBarControllerDelegate協議。推橫幅顯示它。「我知道我需要將一些東西放入我的bannerViewDidLoadAd和failToReceive方法中,但對於如何做到這一點有點困惑。

我不希望廣告顯示在我所有的視圖控制器(只是其中6)和我也有在app數模態的觀點(在任何的這些無廣告)。

下面是我的一些代碼: 在我的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]; 
    } 
} 
+0

我正在考慮使用通知中心來處理這個問題 - 什麼想法? –

回答

6

使用NSNotificationCenter來解決這個問題的工作就像一個魅力,現在我的網絡成癮者都一旦他們被裝上來了 - 好的!如果任何人都需要這個這裏是額外的代碼我輸入: (在我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]; 
+0

你在使用UITableViewController嗎? – Jacob

0

我一直在努力與這個自己,這和許多其他的答案非常有幫助。然而,他們似乎都繼承了與AppDelegate交互的someViewController.m代碼,這看起來是錯誤的。

我的解決辦法是使應用程序代理傳遞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問題?

相關問題