Swift视图似乎延迟加载到窗口层次结构中

时间:2018-11-15 14:02:28

标签: swift xcode

一件非常奇怪的事情正在发生,看来我的初始视图控制器已加载,执行了其逻辑,并且除了实际的视图本身之外,所有其他视图都没有添加到层次结构中,直到发生其他一切为止。

    protocol OnboardDisplayLogic: class
{
    func handleUserConfirmation(viewModel: OnboardModels.CheckForUser.ViewModel)
}

class OnboardViewController: UIViewController, OnboardDisplayLogic {

    var interactor: OnboardInteractor?
    var router: (NSObjectProtocol & OnboardRoutingLogic & OnboardDataPassing)?

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    //MARK: Setup

    private func setup() {
        let viewController = self
        let interactor = OnboardInteractor()
        let presenter = OnboardPresenter()
        let router = OnboardRouter()
        viewController.interactor = interactor
        viewController.router = router
        interactor.presenter = presenter
        presenter.viewController = viewController
        router.viewController = viewController
        router.dataStore = interactor
    }

    private func setupView() {
        view.backgroundColor = UIColor.brown
    }

    //MARK: Routing

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let scene = segue.identifier {
            let selector = NSSelectorFromString("routeTo\(scene)WithSegue:")
            if let router = router, router.responds(to: selector) {
                router.perform(selector, with: segue)
            }
        }
    }

    //MARK: View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        setupView()
        interactor?.checkForUser()
    }

    func handleUserConfirmation(viewModel: OnboardModels.CheckForUser.ViewModel) {
        if let username = viewModel.username {
            print("Logged in user: \(username)")
            router?.routeToUserFeed(segue: nil)
        } else {
            print("No user logged in")
            router?.routeToLoginRegister(segue: nil)
        }
    }

我认为延迟的原因是,尽管我将视图背景色设置为棕色,但在print("user not logged in")代码上使用断点却将其打印到控制台,因为没有用户确定交互器,但视图仍为白色。直到我跨步并完成所有代码后,屏幕才变成棕色。

因此我得到了错误

  

警告:尝试展示...其视图不在窗口中   等级!

因为某些原因导致视图无法添加到最后。

1 个答案:

答案 0 :(得分:0)

在进入视图控制器生命周期之前,不会加载实际视图。 如果您需要先加载视图以进行设置,然后再将其添加到超级视图的层次结构中,则只需使用视图的吸气剂(let _ = viewController.view)。

UIViewController也有loadView()方法,请检查一下:Apple documentation

我们在Clean Swift中也遇到了这类问题。正确的工作方式是从情节提要中实例化,仅使用正常的segues /生命周期,就像MVC在Apple示例中所做的那样。

您应该从情节提要let viewControllerToPush = MyVCSublass(...)实例化并使用该视图控制器,而不是执行let viewControllerToPush = storyboard?.instantiate...