swift - 使用 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
}
解决方案
我的解决方案......我遵循了这个说明(objective-c):
(见那里:实例化应用程序用户界面)
...并在我的 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
}
}
现在该应用程序在发布模式下也可以正常运行。
推荐阅读
- python - 调用带有可选参数的函数
- ssis - 将 SharePoint 2016 列表导出到 SQL Server 2016 数据库
- angularjs - 如何将编辑的 ng 重复数据推送到另一个数组 onclick 复选框
- php - Symfony 3 在 EntityType 表单字段中获取对象数据
- ios - 在 UITableViewCell 的不同类之间切换
- r - 将 cat&sprintf 输出转换为代码/函数/计算
- java - 使用 iText 将值设置为组合框
- javascript - 定位父节点 3 级的更好方法?
- java - 为什么 StringBuilder append 方法会抛出 MalformedInputException?
- ios - 在集合视图中使用 tableview 时滚动出错