Xcode 11.3.1 にアップグレードした後、アプリを開くときに一部のデバイスでアプリがクラッシュし始めたことに気付きました。これは、さまざまな iOS バージョンと iPhone モデルで発生します。ただし、同じ iOS バージョンまたは iPhone モデルの一部のデバイスでは、アプリは正常に動作します。
これらのデバイスにアプリの以前のビルド (以前の Xcode バージョンでビルドされたもの) をインストールすると、クラッシュは発生しません。
Optional
デバッグ中に、ログイン モジュールのプレゼンターを使用してラップを解除しようとするとクラッシュが発生することがわかりました。このプレゼンターは作成時に値を持ち、割り当てられますrootViewController
が、AppDelegate で設定した後window.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 を使用してみましたSet RootViewController iOS 13を使用して、RootViewController を設定します。
この問題の原因について何か考えはありますか?
追加情報:
この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
変数は本来あるべき値を持っていますが、 isの値presenter
を割り当てるとすぐに。window.rootViewController = navigationController
presenter
nil