2015-02-04 2 views
0

Я пытаюсь обрабатывать свой iAd через singleton, так как я использую эти баннеры в нескольких контроллерах представлений. Теперь я смущен тем, что хранят эти объекты, поскольку я перемещаю их по-разному на каждом контроллере представления, когда отображается объявление или возникает ошибка. Вот мой код:iOS: iAd Singleton Confusion

Singleton:

+ (MySingleton *)sharedInstance { 
    static dispatch_once_t once; 
    static MySingleton * sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

- (id)init 
{ 
    if (self = [super init]) { 

     if ([ADBannerView instancesRespondToSelector:@selector(initWithAdType:)]) { 

      self.bannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner]; 
     } else { 
      self.bannerView = [[ADBannerView alloc] init]; 
     } 
    } 
    return self; 
} 

А вот как это можно инициализировать:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    //iAd 
    if(![[NSUserDefaults standardUserDefaults] objectForKey:kInAppPurchaseNoAds]){ 
     self.bannerView = [MySingleton sharedInstance].bannerView; 
     self.bannerView.delegate = self; 
     self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, self.view.frame.size.height); 
     [self.view addSubview:self.bannerView]; 
    } 
} 

И методы делегата:

- (void)showBanner 
{ 
    if(!self.isBannerVisible){ 
     [self.view layoutIfNeeded]; 
     [UIView animateWithDuration:0.5 
         animations:^{ 
          //Restore the constraint 
          self.mainContainerToSuperviewConstraint.constant = 50; 
          //Move the banner on 
          self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, -50); 
          [self.view layoutIfNeeded]; 
         } completion:^(BOOL finished) { 
          self.isBannerVisible = YES; 
         }]; 
    } 
} 

- (void)hideBanner 
{ 
    if(self.isBannerVisible){ 
     [self.view layoutIfNeeded]; 
     [UIView animateWithDuration:0.5 
         animations:^{ 
          //Restore the constraint 
          self.mainContainerToSuperviewConstraint.constant = 0; 
          //Move the banner off 
          self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, self.bannerView.frame.size.height); 
          [self.view layoutIfNeeded]; 
         } completion:^(BOOL finished) { 
          self.isBannerVisible = NO; 
         }]; 
    } 
} 

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    [self showBanner]; 
} 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    [self hideBanner]; 
} 

Теперь то, что я запутался является , нужно ли снова проверять положение представления баннера, если пользователь находился в другом представлении, а также iAd, где прямоугольник с видимым баннером было, скажем, 75 из нижней части экрана, а не 50? Или эти позиции не влияют на AdBannerView, а только на один объект в каждом классе ?! Я имею в виду, если бы он был в другом представлении, и там код переместил Banner на 75 пикселей снизу, эти 75 пикселей хранятся в моем одноэлементном AdView? Итак, у первоначального вида теперь был знамя 75, а не 50?

ответ

2

Я бы предположил, что нет единого окна для просмотра - один экземпляр представления может быть подвью только для одного вида, поэтому вам нужно отслеживать добавление/удаление его, а также вам нужно установить кадр при каждом его добавлении как подпункт. Вам лучше иметь какой-то контроллер базового представления, чтобы разделить логику создания и управление баннерами.

+0

Но не рекомендуется ли создавать iAd BannerView в качестве Singleton? Я имею в виду, что у меня есть 3 диспетчера представлений, показывающих iAd, я могу каждый раз создавать новые без проблем. – MichiZH

 Смежные вопросы

  • Нет связанных вопросов^_^