前言
前两个月项目中有一个需求,添加一个首页广告位,只显示在首页,启动APP后进入首页展示,推送进入展示,未登录返回展示,如下图:

看着貌似挺简单的,自定义弹窗呗!
实现方式
UIWindow上添加一个蒙版,再添加一个自定义的View,即OK
问题来了
- App运行时,有一个启动广告图,会出现首页的广告位显示在启动页上的情况。
- 启动后首页广告位未加载时,点击别的tab,广告位可能会显示在别的页面。
- 通过推送消息进入App或启动App,会有各种意想不到的问题,例如:未登录要先进入登录页面,未登录返回首页的话再显示广告位,或广告位可能会显示在登录页面
总之会有这种意想不到的问题,因为是弹在UIWindow上的,所有的页面都有机会显示,尝试了各种办法解决,始终是有各种问题,例如:
- 把弹窗弹在tabBarController.view上
[showVC.tabBarController.view sendSubviewToBack:showVC.view];
[showVC.view bringSubviewToFront:adView.overlayer];
但是依然会有类似的问题,万般无奈,用通知勉强实现需求,时而移除,时而显示,也是够麻烦了,最笨的解决办法了,没办法脑子笨。
后话
直到上周无意间想了想,试了一下,算是解决了之前的问题,不用用通知那么麻烦的来控制,各种地方判断监听。是这样的:
// 获取根视图
IDBMainController *mainVC = (IDBMainController *)[UIApplication sharedApplication].keyWindow.rootViewController;
// 当前导航
IDBNavigationController *curNavCon = [mainVC.viewControllers objectAtIndex:mainVC.selectedIndex];
// 当前页面
UIViewController *curVC = [curNavCon.viewControllers lastObject];
if (![curVC isKindOfClass:[IDBHomeController class]]) {
// 如果不是在首页,无需操作
return;
}
好吧,折磨了很久的问题终于就这样完了。
备注:其实之前也有类似的解决办法,只是想的不够完善。
NSArray *viewControllers = self.navigationController.viewControllers;
for (UIViewController *viewCon in viewControllers) {
if ([viewCon isMemberOfClass:[IDBHomeController class]]) {
isDayBox = YES;
break;
}
}
大概是这样判断的,但是是没有效果的,因为导航的问题。
网友评论