После обновления до Xcode 11.3.1 мы заметили, что наше приложение начало открывать sh на некоторых устройствах. Это происходит на разных iOS версиях и iPhone моделях. Однако на некоторых устройствах с той же версией iOS или iPhone приложение работает нормально.
При установке более ранней сборки приложения на эти устройства (которая была собрана с более ранней версией Xcode) sh не происходит.
Во время отладки мы обнаружили, что cra sh возникает при попытке развернуть 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, упомянутый здесь Установить 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
имеет значение presenter
, как и должно быть, но как только мы присвоим window.rootViewController = navigationController
, значение presenter
будет nil
.