Ios 应用程序在使用Xcode 11.3.1构建后打开时崩溃
升级到Xcode 11.3.1后,我们注意到我们的应用程序在打开时在某些设备上开始崩溃。它发生在不同的iOS版本和iPhone型号上。然而,在一些具有相同iOS版本或iPhone型号的设备上,该应用程序运行良好 在这些设备上安装应用程序的早期版本(使用早期Xcode版本构建)时,不会发生崩溃 在调试过程中,我们发现在使用登录模块的演示者尝试打开一个Ios 应用程序在使用Xcode 11.3.1构建后打开时崩溃,ios,swift,iphone,xcode,ios13.3,Ios,Swift,Iphone,Xcode,Ios13.3,升级到Xcode 11.3.1后,我们注意到我们的应用程序在打开时在某些设备上开始崩溃。它发生在不同的iOS版本和iPhone型号上。然而,在一些具有相同iOS版本或iPhone型号的设备上,该应用程序运行良好 在这些设备上安装应用程序的早期版本(使用早期Xcode版本构建)时,不会发生崩溃 在调试过程中,我们发现在使用登录模块的演示者尝试打开一个可选时发生崩溃。此演示者在创建和分配时有一个值,但在AppDelegate窗口中设置了rootViewController之后。rootViewCon
可选
时发生崩溃。此演示者在创建和分配时有一个值,但在AppDelegate窗口中设置了rootViewController
之后。rootViewController=navigationController
执行跳转到下面显示的viewDidLoad()
函数,此时演示者为nil
class LoginViewController: LoginPasswordResetViewController {
var presenter: LoginPresenterProtocol!
override func viewDidLoad() {
super.viewDidLoad()
updateUI(model: presenter.loadViewModel())
presenter.viewDidLoad()
}
}
AppDelegate.swift中的相关代码:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let env = Environment()
if let app = UIApplication.shared.delegate as? AppDelegate,
let window = app.window,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
let navigationController = UINavigationController(rootViewController: loginVC)
window.rootViewController = navigationController
window.makeKeyAndVisible()
}
return true
}
我尝试使用这里提到的SceneDelegate.swift设置RootViewController,但没有成功
关于这个问题的原因有什么想法吗
其他信息:
import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let env = Environment()
if let windowScene = scene as? UIWindowScene,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
self.window = UIWindow(windowScene: windowScene)
self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
self.window!.makeKeyAndVisible()
}
}
}
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 13.0, *) {} else {
let env = Environment()
if let app = UIApplication.shared.delegate as? AppDelegate,
let window = app.window,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
window.rootViewController = UINavigationController(rootViewController: loginVC)
window.makeKeyAndVisible()
}
}
return true
}
createModule
函数初始化并设置presenter
:
func createModule(moduleData: LoginModuleDataProtocol, service: LoginServiceProtocol, storageService: LocalStorageServiceProtocol) -> LoginViewController? {
guard let viewController: LoginViewController = UIStoryboard.viewController(from: self) else {
return nil
}
let presenter = LoginPresenter()
let interactor = LoginInteractor()
let router = LoginRouter()
// VC
viewController.presenter = presenter
// Presenter
presenter.viewController = viewController
presenter.interactor = interactor
presenter.router = router
// Interactor
interactor.presenter = presenter
interactor.dataManager = LoginDataManager(data: moduleData, service: service, storageService: storageService)
// Router
router.viewController = viewController
return viewController
}
创建模块后,
loginVC
变量应具有presenter
值,但只要我们分配window.rootViewController=navigationController
,presenter
的值为nil,我就设法使其工作。我不得不使用SceneDelegate
加载组件来启动我的iOS 13应用程序,但我只是在阅读之后才设法让它工作
class LoginViewController: LoginPasswordResetViewController {
var presenter: LoginPresenterProtocol!
override func viewDidLoad() {
super.viewDidLoad()
updateUI(model: presenter.loadViewModel())
presenter.viewDidLoad()
}
}
以下是对我有效的结果:
SceneDelegate.swift:
import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let env = Environment()
if let windowScene = scene as? UIWindowScene,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
self.window = UIWindow(windowScene: windowScene)
self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
self.window!.makeKeyAndVisible()
}
}
}
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 13.0, *) {} else {
let env = Environment()
if let app = UIApplication.shared.delegate as? AppDelegate,
let window = app.window,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
window.rootViewController = UINavigationController(rootViewController: loginVC)
window.makeKeyAndVisible()
}
}
return true
}
AppDelegate.swift:
import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let env = Environment()
if let windowScene = scene as? UIWindowScene,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
self.window = UIWindow(windowScene: windowScene)
self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
self.window!.makeKeyAndVisible()
}
}
}
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 13.0, *) {} else {
let env = Environment()
if let app = UIApplication.shared.delegate as? AppDelegate,
let window = app.window,
let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
service: LoginService(env: env),
storageService: LocalStorageService(env: env)) {
window.rootViewController = UINavigationController(rootViewController: loginVC)
window.makeKeyAndVisible()
}
}
return true
}
当它只在某些设备上崩溃时,可能是时间问题。createModule
函数如何设置loginVC
的presenter
属性?您的presenter在哪里初始化?我添加了一些额外的信息@andreasetjen,调用createModule
函数后,loginVC
有一个有效的presenter
。您的viewcontroller对presenter有强引用吗?@Manoj第一个代码位是LoginViewController
类(忘记添加它),因此引用应该是强引用。