public override void Execute(CallbackActionWaiter callbackActionWaiter, bool animated) { UIViewController host = Controller.Host; var vc = Controller.AsViewController(); callbackActionWaiter.WaitOne(); host.PresentViewController(vc, animated, callbackActionWaiter.ReleaseOne); }
public override void Execute(CallbackActionWaiter callbackActionWaiter, bool animated) { if (HostStack.Modal is NavigationControllerInnerStack navigationControllerInnerStack) { callbackActionWaiter.WaitOne(); navigationControllerInnerStack.Host.DismissViewController(animated, callbackActionWaiter.ReleaseOne); callbackActionWaiter.Add(() => navigationControllerInnerStack.Host.SafeDispose()); } else if (HostStack.Modal is SimpleControllerInnerStack simpleControllerInnerStack) { callbackActionWaiter.WaitOne(); simpleControllerInnerStack.Controller.DismissViewController(animated, callbackActionWaiter.ReleaseOne); callbackActionWaiter.Add(() => simpleControllerInnerStack.Controller.SafeDispose()); } else { throw new NotSupportedException($"Unsupported type of {HostStack.Modal.GetType().Name}"); } }
public async Task UpdateNavigation(NavigationOperation <TViewModel> navigationOperation, INavigationInProgress navigationInProgress) { if (navigationOperation.Pushes.Count == 0 && navigationOperation.Pops.Count == 0) { return; } var controllersToPush = navigationOperation.Pushes.Select(x => new PushInformation <TViewModel>(_factoryAssociation[x.Screen], x.Instance)); foreach (var push in navigationOperation.Pushes) { await push.Instance.GetViewModel(""); //TODO: add route here } if (navigationInProgress.IsCancelled) { Task.Run(async() => { // we wait 10s just in case, shouldn't put too much memory pressure on GC await Task.Delay(10_000); foreach (var push in navigationOperation.Pushes) { push.Instance.ViewModelInstance?.SafeDispose(); } }).ConfigureAwait(false); return; } navigationInProgress.Commit(); UIApplication.SharedApplication.InvokeOnMainThread(() => { var callbackActionWaiter = new CallbackActionWaiter(); callbackActionWaiter.WaitOne(); _navigationStack.EnsureInitialized(_navigationController); _navigationStack.ApplyActions(navigationOperation.Pops.Count, controllersToPush, callbackActionWaiter); // lines below could be commented if we encounter issues with viewmodel disposing callbackActionWaiter.Add(() => { foreach (PopAction <TViewModel> pop in navigationOperation.Pops) { pop.Instance.ViewModelInstance?.DispatchSafeDispose(); } }); Task.Run(async() => { // we wait 10s to let the time for navigation controller animations before disposing content await Task.Delay(10_000); UIApplication.SharedApplication.InvokeOnMainThread(callbackActionWaiter.ReleaseOne); }); }); }