Как вернуться к предыдущему контроллеру в один клик после просмотра нескольких контроллеров одного типа на iOS? - PullRequest
0 голосов
/ 25 июня 2018

Мы используем MvvmCross 4.4.0 в нашем проекте iOS , и я столкнулся со следующей проблемой:

  • Мне нужно реализовать страницу "Item" со ссылкой на другую «Элемент» page;
  • Мне нужна мгновенная обратная навигация от любой "Элемента" к предыдущему контроллеру ( "Каталог" контроллера).

Диаграмма:

Каталог --ConcreteItem -> Item1 --MoreItems -> Item2 --MoreItems ->

Item3 --BackNavButton -> Каталог.

В Custom ViewPresenter я делаю следующее:

                var topViewController = ParentRootViewController.TopViewController;
                ParentRootViewController.PushViewController(currentViewController, needAnimation);

                if (topViewController.GetType() == currentView.GetType()
                    && /*Logic to determine if its correct view types*/)
                {
                    topViewController.RemoveFromParentViewController();
                    topViewController.Dispose();
                }

И на самом деле это работает, пока я не вернусь на страницу "Каталог" . Проблема в том, что мне нужно нажимать кнопку «назад» так много раз, что я нажимал кнопку «Еще» на странице «Элемент» . Также, если мы используем пользовательскую кнопку возврата с таким кодом в «Каталоге» и «Элемент» страниц:

  if (NavigationController?.NavigationBar?.BackItem != null)
        {
             var backbutton = new UIBarButtonItem(" ",
                                                 UIBarButtonItemStyle.Plain,
                                                 (sender, e) => { NavigationController?.PopViewController(true); })
            {
                Image = UIImage.FromBundle("BackButtonImage")
            };

            NavigationItem.LeftBarButtonItem = backbutton;
        }

, затем происходит сбой приложения при нажатии «Назад» NavButton на «Каталоге» страница с lambda

(sender, e) => { NavigationController?.PopViewController(true);

Расположенный объект ItemPageViewController .

Вопрос: как правильно реализовать страницу "SingleTop" в MvvmCross?

Или

Как решить эту проблему?

P.S .: Если из MvxPresenter удалить строку

topViewController.Dispose();

тогда в настраиваемой лямбде сгенерирует исключение NullReferenceException.

P.P.S .: Я считаю, что проблема в том, что я не удаляю контроллер из стека навигации. Я пытался удалить контроллеры в Custom View Presenter, но, во-первых, иногда он нулевой, и даже с нулевой проверкой ничего не помогло.

1 Ответ

0 голосов
/ 26 июня 2018

UINavigationController имеет функцию PopToViewController(UIViewController viewController, bool animated);

Вместо удаления всех ViewController, когда представления одного типа, вы можете открыть каталог ViewController, когда нажата кнопка.

UINavigationController имеет свойство ViewControllers, которое мы можем использовать, чтобы найти CatalogueViewController.

Поскольку вы используете MvvmCross, мы проверим тип ViewModel.

var catalogueController = NavigationController.ViewControllers.First(c => 
    ((IMvxIosView)c).ViewModel.GetType() == typeof(CatalogueViewModel));

Теперь вы можете использовать функцию PopToViewController, чтобы закрыть все виды до CatalogueController

CurrentNavigationController.PopToViewController(catalogueController, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...