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