一件非常奇怪的事情正在发生,看来我的初始视图控制器已加载,执行了其逻辑,并且除了实际的视图本身之外,所有其他视图都没有添加到层次结构中,直到发生其他一切为止。
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")
代码上使用断点却将其打印到控制台,因为没有用户确定交互器,但视图仍为白色。直到我跨步并完成所有代码后,屏幕才变成棕色。
因此我得到了错误
警告:尝试展示...其视图不在窗口中 等级!
因为某些原因导致视图无法添加到最后。
答案 0 :(得分:0)
在进入视图控制器生命周期之前,不会加载实际视图。
如果您需要先加载视图以进行设置,然后再将其添加到超级视图的层次结构中,则只需使用视图的吸气剂(let _ = viewController.view
)。
UIViewController
也有loadView()
方法,请检查一下:Apple documentation。
我们在Clean Swift中也遇到了这类问题。正确的工作方式是从情节提要中实例化,仅使用正常的segues /生命周期,就像MVC在Apple示例中所做的那样。
您应该从情节提要let viewControllerToPush = MyVCSublass(...)
实例化并使用该视图控制器,而不是执行let viewControllerToPush = storyboard?.instantiate...
。