【问题标题】:Changing canDisplayBannerAds to NO does not update the view to remove ad banner将 canDisplayBannerAds 更改为 NO 不会更新视图以删除广告横幅
【发布时间】:2014-01-07 03:10:57
【问题描述】:

奇怪的问题,我已经把头撞在墙上好几个小时了,一直没能解决。

我有一个使用情节提要的仅限 iOS 7 的应用程序。在我的主根视图控制器上,我使用 self.canDisplayBannerAds = YES 在视图底部显示 iAd 横幅。这完美无缺。

我有一个设置视图控制器,我的用户可以从那里进行应用内购买以永久删除广告。该功能也有效。我在 NSUserDefaults standardUserDefaults 中存储了一个 BOOL 值来跟踪他们是否进行了购买。

让我难过的是,如果用户在横幅中接收广告,进入设置视图控制器,然后进入我的购买视图控制器,成功购买,然后返回主根视图,横幅广告仍然存在可见的。如果用户完全退出应用程序,然后重新启动,它不会再次显示,因为这是我在 viewWillAppear 中显示横幅的方式:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bool saved = [defaults boolForKey:t_Save];

if (saved == NO) {
    self.canDisplayBannerAds = YES;
} else if (saved == YES) {
    self.canDisplayBannerAds = NO;
}
NSLog(self.canDisplayBannerAds ? @"YES" : @"NO");

因此,当他们在购买或恢复购买后重新启动应用时,此逻辑可以正常工作。但是,我希望在他们购买后立即更新视图。但是,当他们第一次启动它时,我不能让那个愚蠢的横幅广告在应用程序中消失。

如果我创建一个仅设置 self.canDisplayBannerAds = NO 的按钮,那么这会导致横幅广告消失,这很奇怪。但是,当在 viewWillAppear、viewDidAppear 中调用时,甚至在我创建的专用方法中调用时,它都不起作用,一旦购买,它就会被调用。

我在想也许横幅视图设置在某处的缓存中,它只是没有被取消,但我不知道如何强制这样做。我也在想如果我可以强制根视图控制器基本上为零并从头开始,那可能会做到,但我也不知道如何强制。

有人有什么想法吗?

【问题讨论】:

  • 我遇到了类似的问题。进行购买(或恢复购买)后,在完成购买(或恢复)的视图控制器上,广告会继续出现。但是,视图的大小已重新调整为没有横幅广告的大小。所以,在我的情况下,滚动视图现在滚动得不够充分。在可能有广告的应用程序中的其他视图控制器上,它们在购买时被正确禁用。我还发现,如果在购买时没有当前显示广告,那么问题就不会发生。

标签: ios cocoa-touch adbannerview candisplaybannerads


【解决方案1】:

我遇到了同样的问题,并找到了适合我的解决方法:

self.canDisplayBannerAds = NO;
for (id aView in self.view.subviews) {
  if ([aView isKindOfClass:[ADBannerView class]]) {
     [(ADBannerView *)aView setHidden:YES];
  }
}

我不认为这是一个干净的解决方案,但由于它最终可以工作,我会保留它,直到找到更好的解决方案。

【讨论】:

  • 嗯。现在,在对我的应用程序进行了各种更改之后,我发现我不需要这种解决方法。只需将 self.canDisplayBannerAds 设置为 NO 即可使当前显示的横幅广告以适当的方式在屏幕外显示动画。我看不到发生了什么变化,这很烦人。
  • 克里斯蒂安,你摇滚。我终于有时间测试您的解决方案,并且它有效。谢谢!
  • 我也找不到任何其他解决方案或解释为什么会发生这种情况。您的修复工作完美。很棒的代码。
【解决方案2】:

我将在控制广告的实现文件 (.m) 中创建一个方法,还将方法头包含到 .h "- (void) viewWillAppear;"

- (void)viewWillAppear
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
bool saved = [defaults boolForKey:t_Save];

if (saved == NO) {
    self.canDisplayBannerAds = YES;
} else if (saved == YES) {
    self.canDisplayBannerAds = NO;
}
NSLog(self.canDisplayBannerAds ? @"YES" : @"NO");
}

一旦确认购买,调用其他类的方法,

例子;

AppDelegate *Appdel = [[AppDelegate alloc] init];
[Appdel viewWillAppear];

【讨论】:

  • 您好,谢谢,但我不确定我是否理解……您是在建议我从购买视图调用 viewWillAppear 方法吗?但问题不在于该方法没有被调用——当我回到原来的视图时,viewWillAppear 方法被调用了。只是广告横幅不会消失。我不确定你的建议会有什么不同。
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多