首页 > 解决方案 > 使用 BlackBerry Dynamics SDK 时如何访问 rootViewController

问题描述

我正在使用多个视图控制器(使用情节提要,没有导航控制器,没有启动屏幕)来开发一个 iOS 13 应用程序。为了解除/呈现视图控制器,我使用以下代码:

@objc func onMenuItemUploadsTap(_ sender: UIView) {
    self.view.window!.rootViewController?.dismiss(animated: false, completion: {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let vc = appDelegate.getViewController(viewController: .Uploads)
        vc.modalPresentationStyle = .fullScreen
        UIApplication.shared.windows.first!.rootViewController!.present(vc, animated: true, completion: nil)
    })
}

一旦 viewController 被实例化,我将它们保存在 AppDelegate 中,因为用户可以从 viewController 跳转到 viewController,因此 viewController 必须保持它的状态/值,这就是我使用的原因:

let vc = appDelegate.getViewController(viewController: .Uploads)

好的...当我在发布模式下运行应用程序时,只显示初始 viewController(名为:HomeController),而不是我喜欢呈现的“vc”,调试控制台让我知道:

Attempt to present <XXX.UploadController: 0x7ffc71152400> on <UIViewController: 0x7ffc70714c40> whose view is not in the window hierarchy!

注意: UIViewController: 0x7ffc70714c40 不是 HomeController!(“HomeController”在情节提要中标记为:是初始视图控制器)

在调试模式(没有 BlackBerry SDK)下,应用程序运行良好。

我的 AppDelegate::didFinishLaunchingWithOptions...:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
       
    // Override point for customization after application launch.
    
#if !DEBUG
    XXXGDiOSDelegate.sharedInstance.appDelegate = self
    GDiOS.sharedInstance().authorize(XXXGDiOSDelegate.sharedInstance)
#else
    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeController") as? HomeController
    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = controller
#endif
    return true
}

我的问题:使用 BlackBerry SDK 时如何访问 rootViewController ?

我正在使用:macOS Mojave 10.14.6、xCode 11.1 (11A1027)、BlackBerry_Dynamics_SDK_for_iOS_v6.1.0.170

提前致谢!

我试过了:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
       
    // Override point for customization after application launch.
    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeController") as? HomeController
    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = controller

#if !DEBUG
    XXXGDiOSDelegate.sharedInstance.appDelegate = self
    GDiOS.sharedInstance().authorize(XXXGDiOSDelegate.sharedInstance)
#endif
    return true
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
       
    // Override point for customization after application launch.
    
#if !DEBUG
    XXXGDiOSDelegate.sharedInstance.appDelegate = self
    GDiOS.sharedInstance().authorize(XXXGDiOSDelegate.sharedInstance)
#endif

    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeController") as? HomeController
    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = controller

    return true
}

标签: swiftblackberryios13rootviewcontroller

解决方案


我的解决方案......我遵循了这个说明(objective-c):

https://developer.blackberry.com/devzone/files/blackberry-dynamics/ios/_app_user_interface_restrictions.html

(见那里:实例化应用程序用户界面)

...并在我的 AppDelegate 中实现了这一点:

成员变量:

var run_once: Bool = false

修改了didAuthorize:

func didAuthorize() -> Void {

    print(#file, #function)

    //I added this if block:
    if !self.run_once {
        self.run_once = true
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeController") as? HomeController
        window = UIWindow()
        window?.makeKeyAndVisible()
        window?.rootViewController = controller
        UIApplication.shared.windows.first!.rootViewController = controller
    }
}

现在该应用程序在发布模式下也可以正常运行。


推荐阅读