Beispiel #1
0
        public override void Execute(CallbackActionWaiter callbackActionWaiter, bool animated)
        {
            UIViewController host = Controller.Host;

            var vc = Controller.AsViewController();

            callbackActionWaiter.WaitOne();
            host.PresentViewController(vc, animated, callbackActionWaiter.ReleaseOne);
        }
Beispiel #2
0
 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);
                });
            });
        }