UINavigationController (rootViewController: MyViewController ()) запускает viewdidLoad и возвращает nil navigationController - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь понять логику инициализации UINavigationController с помощью инициализатора:

UINavigationController(rootViewController: MyViewController())

Приложение, которое я изменяю, использовало этот инициализатор, а внутри MyViewController пользовательский инициализатор, который у меня был:

class MyViewController:UIViewController{

    init(){
        super.init(nibName: "MyViewController", bundle: nil)
    }

}

В методах жизненного цикла MyViewController у viewDidLoad раньше не было nil для значения navigationController.

Единственное изменение, которое я сделал, - внутри пользовательского инициализатора. Сейчас:

init(){
    super.init(nibName: nil, bundle: nil)

    /*EDIT*/
    let dummyMe = UIView()
    view.addSubview(dummyMe)

}

Другими словами, я не хочу использовать файл xib. Это изменение привело меня к краху, и после некоторой отладки я понял, что значение navigationController в методе viewDidLoad равно nil, но не в моем методе viewWillAppear.

Как это возможно? Должен ли инициализатор UINavigationController вызвать viewDidLoad? Почему navigationController значение nil сейчас?

Спасибо

1 Ответ

1 голос
/ 18 июня 2019

Вы должны проверить свой код.Пример работает, как и ожидалось, вы можете вставить его на игровую площадку:

import UIKit
import PlaygroundSupport

class MyViewController:UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        print(#function)
        print(navigationController)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print(#function)
        print(navigationController)
    }
}

let controller = UINavigationController(rootViewController: MyViewController())

этот код не будет запускать методы жизненного цикла.Добавьте PlaygroundPage.current.liveView = controller.view к триггеру и посмотрите:

viewDidLoad()
Optional(<UINavigationController: 0x7ffb18001200>)
viewWillAppear
Optional(<UINavigationController: 0x7ffb18001200>)

UPD:

для добавления переопределения пользовательских представлений loadView:

override func loadView() {
    super.loadView()
    let subviewFrame = view.bounds
    let dummyMe = UIView(frame: subviewFrame)
    dummyMe.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    dummyMe.backgroundColor = .yellow
    view.addSubview(dummyMe)
}

или даже:

override func loadView() {   
    let dummyMe = UIView()
    dummyMe.backgroundColor = .yellow
    view = dummyMe
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...