From d91bfd8e11fa52d77b256196bfa582971843fd3a Mon Sep 17 00:00:00 2001 From: Martin Yankov Date: Thu, 11 Oct 2018 15:16:48 +0300 Subject: [PATCH] fix-next: drawer plugin viewcontroller init (#6379) --- .../application/application.ios.ts | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tns-core-modules/application/application.ios.ts b/tns-core-modules/application/application.ios.ts index 9308aafce..b08dbabf4 100644 --- a/tns-core-modules/application/application.ios.ts +++ b/tns-core-modules/application/application.ios.ts @@ -227,6 +227,8 @@ class IOSApplication implements IOSApplicationDefinition { this._rootView._onRootViewReset(); } const rootView = createRootView(view); + const controller = getViewController(rootView); + this._rootView = rootView; if (createRootFrame.value) { @@ -236,7 +238,7 @@ class IOSApplication implements IOSApplicationDefinition { // setup view as styleScopeHost rootView._setupAsRootView({}); } - const controller = getViewController(rootView); + setViewControllerView(rootView); const haveController = this._window.rootViewController !== null; this._window.rootViewController = controller; if (!haveController) { @@ -339,16 +341,25 @@ function getViewController(view: View): UIViewController { if (viewController instanceof UIViewController) { return viewController; } else { - const nativeView = view.ios || view.nativeViewProtected; - if (nativeView instanceof UIView) { - viewController = iosView.UILayoutViewController.initWithOwner(new WeakRef(view)) as UIViewController; - viewController.view.addSubview(nativeView); - view.viewController = viewController; - return viewController; - } + // We set UILayoutViewController dynamically to the root view if it doesn't have a view controller + // At the moment the root view doesn't have its native view created. We set it in the setViewControllerView func + viewController = iosView.UILayoutViewController.initWithOwner(new WeakRef(view)) as UIViewController; + view.viewController = viewController; + return viewController; + } +} + +function setViewControllerView(view: View): void { + const viewController: UIViewController = view.viewController || view.ios; + const nativeView = view.ios || view.nativeViewProtected; + + if (!nativeView || !viewController) { + throw new Error("Root should be either UIViewController or UIView"); } - throw new Error("Root should be either UIViewController or UIView"); + if (viewController instanceof iosView.UILayoutViewController) { + viewController.view.addSubview(nativeView); + } } global.__onLiveSync = function () {