我有一个5个选项卡的UITabBarController
,其中每个选项卡都是一个UIViewController
。第一个选项卡被称为Timeline
,第二个选项卡被称作Person
,最后一个选项卡被叫做More
。
我已经用我的应用程序实现了In-App Purchase
,在IAP
之前,用户不能更改主题等。我给这个版本带来的一件事是用IAP
删除iAds
。
因此,在制作IAP
之前,Timeline
的底部有一个AdBannerView
,一旦从More
选项卡购买了IAP
,我希望AdBannerView
立即从Timeline
中删除。
问题
现在实际发生的是,我转到More
选项卡,购买IAP
,然后回到Timeline
,AdBannerView
仍然存在。如果我从Timeline
选项卡移到Person
选项卡,再移回Timeline
选项卡,则会删除AdBannerView
。或者,如果我在IAP
之后重新启动应用程序,则AdBannerView
将从Timeline
中删除。无论哪种方式,它都没有达到我的预期,即在IAP
之后,当我第一次从More
选项卡返回Timeline
选项卡时,删除AdBannerView
。
这里有一些代码:
- (void)displayiAdsOrNot
{
NSLog(@"Display iAds or Not");
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"IAPSuccessful"])
{
NSLog(@"BASIC");
self.adBanner = [[self appdelegate] adBanners];
self.adBanner.delegate = self;
if (IDIOM == IPAD)
{
NSLog(@"*** This is the iPad ***");
[self.adBanner setFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-80, 320, 50)];
[self.adBanner setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:self.adBanner];
NSLayoutConstraint *myConstraint =[NSLayoutConstraint
constraintWithItem:self.adBanner
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0];
[self.view addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint constraintWithItem:self.adBanner
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:0];
[self.view addConstraint:myConstraint];
myConstraint =[NSLayoutConstraint constraintWithItem:self.adBanner
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0];
[self.view addConstraint:myConstraint];
}
else
{
NSLog(@"*** THIS IS THE IPHONE ***");
[self.adBanner setFrame:CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-98, 320, 50)];
[self.view addSubview:self.adBanner];
}
}
else
{
NSLog(@"PRO");
[self.adBanner removeFromSuperview];
self.adBanner = nil;
}
}
此方法仅从viewWillAppear
调用。
以NSLogs
为指南,在Timeline
选项卡中,控制台显示BASIC
。当我转到More
选项卡,购买IAP
并返回Timeline
选项卡时,viewWillAppear
再次触发,这触发了displayiAdsOrNot
方法,这一次,我得到了NSLog
PRO
,因为NSUserDefault
IAPSuccessful
现在是真的(在购买完成时完成)。
然而,在这一点上,AdBannerView
仍然被显示。
我尝试过的
我一直在尝试很多方法来实现这一点:
- 在购买完成时创建一个
NSNotification
,在Timeline
选项卡的viewWillAppear
方法中使用侦听器。在该方法中,将self.adBanner
设置为nil
,将其从超级视图中删除,等等。选择器会使用Notification
(在viewWillAppear
之前)启动,但不会发生任何不同 - 我试过
self.adBanner.delegate = self; self.adBanner = nil; [self.adBanner removeFromSuperview];
等,都一样 - 我试过
[self.timelineTableView reloadData];
- 在这个类似的SO问题(在应用内购买后重新加载SKScene或View以删除iAd)之后,我甚至尝试将ivar设置为无效
- 我试着把
self.adBanner
放在屏幕外,但同样的事情正在发生;当加载Timeline时,AdBannerView
仍然存在,直到我去其他地方
我有如下viewWillDisappear
:
- (void)viewWillDisappear:(BOOL)animated
{
self.adBanner.delegate = nil;
self.adBanner=nil;
[self.adBanner removeFromSuperview];
}
这是为了使用共享AdBannerViews
。self.adBanner
是在.h文件中创建的属性,我在.m文件中使用@synthesize adBanner = _adBanner
。
如能就此提供任何指导,我们将不胜感激。
我已经解决了这个问题。
通过删除viewWillDisappear
,并在IAPSuccessful
和Notification
中设置self.adBanner.hidden
= YES
,我成功地在不重新启动应用程序的情况下删除了AdBannerView
。