iOS:iAd Singleton混乱

时间:2015-02-04 15:57:10

标签: ios objective-c iad

我试图通过单件来处理我的iAd,因为我在几个视图控制器中使用这些横幅。现在我对这些对象存储的内容感到困惑,因为当显示广告或发生错误时,我会在每个视图控制器上以不同方式移动它们。这是我的代码:

的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但只影响每个类中的单个对象?!我的意思是,如果他在另一个视图中并且代码将横幅从底部移动到75像素,这些75像素是否存储在我的单身AdView中?那么原始视图的横幅现在为75而不是50?

1 个答案:

答案 0 :(得分:2)

我建议不要为视图设置单例 - 一个视图实例只能是1个视图的子视图,因此您需要跟踪添加/删除它,并且每次再次添加时都需要设置框架一个子视图。你最好有一些基本视图控制器来共享实例化逻辑和横幅的控制。