4

여러 개의 UITableView가있는 앱이 있으며 iAD 구현 과정에 있습니다. 애플의 문서 (http://developer.apple.com/library/ios/#technotes/tn2286/_index.html#//apple_ref/doc/uid/DTS40011212)에 따라, 필자는 애플 리케이션 델리게이트에 속한 공유 배너를 만들었고 애플 리케이션 델리게이트는 배너의 델리게이트이다. 이는 잘 작동하며 배너가로드되고 사용자가 화면을 전환 한 후 다양한보기 컨트롤러에서 광고가 잘 표시됩니다.UITableViews가있는 앱에서 ADBannerView의 공유 인스턴스를 사용합니다.

문제는 뷰 컨트롤러 (내 "fixUpAdView"메서드를 호출하는 곳)의 viweWillAppear 메서드가 배너가로드되기 전에 표시되므로 첫 번째 viewController에 표시되는 광고가 없습니다.

은 내가이 점점 아니에요 부분 추측이 (사과 문서에서) : "가 표시하거나 배너를 숨겨야하는 경우 응용 프로그램 대리인이 현재 뷰 컨트롤러를 말하게 당신이 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; 
} 

: 여기

내 코드의 일부입니다이 문제를 해결하기 위해 NSNotificationCenter를 사용하여

- (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

마법처럼 일했고 지금은 내 제군은 그들이로드되는 즉시 올라간다 - 예! 다른 사람이 여기이 필요로하는 추가 코드 I 입력의 경우 : (내 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]; 
+0

UITableViewController를 사용하고 있습니까? – Jacob

0

나는 이것으로 어려움을 겪었으며, 이것과 많은 다른 대답들이 매우 도움이되었습니다. 그러나 그들은 모두 AppDelegate와 상호 작용하는 someViewController.m 코드를 중계하는 것으로 보이는데, 이는 잘못된 방향으로 보입니다.

내 솔루션은 응용 프로그램 위임 지금처럼 subViewControllers에 adBannerView의 개체를 전달하는 것입니다 :

- (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가 여러 가지 다른보기에서 사용되는데 문제가 있습니까?