代码之家  ›  专栏  ›  技术社区  ›  Glenn Posadas

是否可以在显示的屏幕层次结构中的特定元素处显示UIViewController,以符合Google Admob策略?

  •  0
  • Glenn Posadas  · 技术社区  · 6 年前

    我有一些使用谷歌Admob的自由职业者项目。现在,项目经理告诉我,这些项目不符合谷歌Admob的政策,显然谷歌暂时停止了为特定项目提供广告。

    以下是Google Admob想要的理想流程(参考: https://support.google.com/admob/answer/6201362?hl=en&ref_topic=2745287 ):

    enter image description here

    据我所知,这种实现在iOS中是不可能的。目前项目所做的是在取消中间ad(通过Admob Framework的委派功能, interstitialDidDismissScreen interstitialWillDismissScreen ),然后才会显示下一个屏幕。简言之,在取消了模式呈现的中间广告后,下一个屏幕将被完美呈现!

    我曾多次尝试这样做,当然,正如我们都知道的那样,结果是:

    警告:试图显示其视图不在窗口层次结构中的对象!

    所以我的问题是,有没有一种方法可以在显示的屏幕后面显示屏幕?

    我尝试了其他一些方法,如删除动画,但仍然可以看到上一个屏幕。对于那些想尝试的人来说,这是一个简单的项目:

    AppDelegate。敏捷的

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        let vc1 = ViewController()
        let vc1navcon = UINavigationController(rootViewController: vc1)
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = vc1navcon
        self.window?.makeKeyAndVisible()
    
        return true
    }
    

    多个EVC。敏捷的

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.view.backgroundColor = .red
    
            let barButton = UIBarButtonItem(title: "VC3", style: .plain, target: self, action: #selector(self.presentVc3))
            self.navigationItem.leftBarButtonItem = barButton
    
        }
    
        @objc func presentVc3() {
            let vc3navcon = UINavigationController(rootViewController: ViewController3())
            self.present(vc3navcon, animated: true, completion: nil)
        }
    }
    
    class ViewController2: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.view.backgroundColor = .green
    
        }
    }
    
    class ViewController3: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.view.backgroundColor = .blue
    
            let barButton = UIBarButtonItem(title: "AddVC2", style: .plain, target: self, action: #selector(self.addVc2))
            self.navigationItem.leftBarButtonItem = barButton
    
            let barButton2 = UIBarButtonItem(title: "dismiss", style: .plain, target: self, action: #selector(self.dismissVc3))
            self.navigationItem.rightBarButtonItem = barButton2
        }
    
        @objc func dismissVc3() {
            self.dismiss(animated: true, completion: {
    
            })
        }
    
        @objc func addVc2() {
            let vc2 = ViewController2()
            let vc2navcon = UINavigationController(rootViewController: vc2)
    
            var viewControllers = UIApplication.shared.keyWindow?.rootViewController?.childViewControllers
            viewControllers?.append(vc2navcon)
    
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   trndjc    6 年前

    理想情况下,这些屏幕位于 UINavigationController .因此,从 ViewController1 ,则, present 广告屏幕(最有可能从根目录开始,以防止其显示在分离的视图控制器上)。广告发布后, push ViewController2 从…起 视图控制器1 禁用动画时(您将看不到这一点,因为它是在显示的视图控制器后面执行的)。然后,当广告被取消时,第二个视图控制器将可见,用户可以向后导航,就像广告从未出现一样。

        2
  •  1
  •   J.E. Ramos    6 年前

    我认为可以将Admob view controller添加为第二个view controller的子view controller。按下第二个视图控制器后,显示添加的子视图控制器。

    https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html