Контрольная петля навигации

введите описание изображения здесь

Я делаю приложение, которое имеет функцию корзины покупок. Корзина VC доступна из нескольких VC через кнопку на панели навигации. Пока у меня есть только один контроллер навигации и, как показано на изображении, каждый VC переносит меня на следующий, ничего не притворяется. Третий VC (синяя стрелка, указывающая на) – это VC, который показывает детали продукта / предмета и позволяет мне добавить его в корзину.

Проблема связана с VC корзины покупок. Чтобы отредактировать элемент, я хотел бы повторно использовать те же данные о товаре / товаре (синяя стрелка, указывающая на) VC, которую я использовал ранее.

Прямо сейчас у меня действительно нет проблемы, но я заметил, что когда я создал синюю сцену, панель навигации 3-го VC исчезла в Storyboard, но я все еще мог ее видеть, когда я запускал приложение.

ЗАМЕТКА:

  1. Все снимки на картинке – «Показать»,
  2. В корзине покупок VC нет кнопки, чтобы показать себя, как и остальные 3. Так что технически я помешал бесконечной / петлевой корзине VC – информация о продукте / деталях VC, показывающая друг друга.

Мои вопросы:

  1. Неправильно ли проектировать приложение таким образом, когда VC переходит в другой VC и что другой VC может вернуться к первому VC? Я буду сталкиваться с проблемами в будущем, возможно, утечками памяти?
  2. Есть ли лучший способ достичь того, чего я пытаюсь достичь?

Если кто-то нуждается в дополнительных объяснениях, пожалуйста, дайте мне знать, и я отредактирую свой вопрос.

РЕДАКТИРОВАТЬ: Для пояснения синий сиг в основном представляет собой кнопку в UITableView в тележке VC. Если вы нажмете эту кнопку, она должна открыть информацию о товаре / изделиях VC и позволить вам отредактировать цвет элемента и т. Д. В деталях детализации VC вместо добавления элемента в качестве нового элемента в корзину, я бы показывал Edit который отправит запрос на редактирование в API и отклонит VC обратно в корзину покупок, или я мог бы использовать кнопку «Назад» в навигационном контроллере, чтобы вернуться в корзину покупок.

EDIT2: @beshio

Спасибо за ответ. Однако VC1 на самом деле является моим корневым VC, где начинается все приложение. Я не понял, почему удалены VC из стека контроллера навигации. Я хотел бы, чтобы кнопка «Назад» работала по назначению.

До сих пор я добился того, чего хотел, но я боюсь, что наличие двух VC, переходящих друг к другу, вызовет проблему. Я уже отключил кнопку «Корзина» в VC3 в случае, если VC3 был представлен из корзины, поэтому циклы будут предотвращены. Меня беспокоит только утечка памяти в будущем.

Этого можно добиться.

Здесь я описываю, как реализовать это с помощью вашей диаграммы. Как показывает ваша диаграмма, предположим, что у вас есть VC1, VC2, VC3 (сверху вниз) и VCX (ж / синий). Вам необходимо определить переходы и связанные с ними направления анимации (нажмите: справа налево или поп: слева направо). Как ваш график, если вы определяете переходы и анимации как:

  1. VC1: VC2 (push), VCX (push)
  2. VC2: VC3 (push), VCX (push)
  3. VC3: VCX (push)
  4. VCX to: VC3 (поп)

и предположим, что мы уже создали все контроллеры представлений,

  • Переход от VC1 к VC2

на VC1:

navigationController!.pushViewController(VC2, animated: true) 

на VC2:

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // remove VC1 from navigation stack (I assume VC1 is not a root VC) let allControllers = NSMutableArray(array: navigationController!.viewControllers) allControllers.removeObject(at: allControllers.count - 2) navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false) } 
  • Переход от VC1 к VCX

на VC1:

 navigationController!.pushViewController(VCX, animated: true) 

в VCX: (A)

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let allControllers = NSMutableArray(array: navigationController!.viewControllers) if (navigationController!.viewControllers[allControllers.count-2] != VC3) { // if not from VC3, remove VC from stack and put VC3 allControllers.removeObject(at: allControllers.count - 2) allControllers.insert(VC3, at: allControllers.count - 1) navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false) } 
  • Переход от VC2 к VC3

на VC2:

 navigationController!.pushViewController(VC3, animated: true) 

при VC3: (B)

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let allControllers = NSMutableArray(array: navigationController!.viewControllers) if (navigationController!.viewControllers[allControllers.count-2] == VC2) { // if from VC2, remove it allControllers.removeObject(at: allControllers.count - 2) navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false) } } 
  • Переход от VC2 к VCX

на VC2:

 navigationController!.pushViewController(VCX, animated: true) 

в VCX: то же, что и (A)

  • Переход от VCX к VC3

в VCX:

 navigationController!.popViewController(animated: true) 

при VC3: то же, что и (B)

Примечание viewDidAppear вызывается, когда пользователи прокручивают (слева направо), чтобы вернуться назад и отменить его в пути (== проведите по экрану влево). Итак, вам нужен еще небольшой код в viewDidAppear против этой ситуации.

Если вы хотите различное направление анимации, манипулируя стеком и используя push / pop, вы можете легко достичь этого. Это объясняет, как.

Потрясающие.

В этих сценариях вы должны использовать setViewControllers([UIViewController], animated: Bool) чтобы получить требуемые контроллеры просмотра в стеке, когда вы получаете много контроллеров, сложенных циклами.

Другой способ – написать свой собственный класс, полученный из UINavigationController , используя методы, pushToCheckout(animated:Bool), popToEditCart(animated:Bool) , removeIntermediateControllers()

  • Пользовательский init для UIViewController в Swift с настройкой интерфейса в раскадровке
  • Отключите и представите контроллер модального представления с одной анимацией
  • Условно пропускание UIViewController в приложении iOS 5 с помощью UINavigatonController
  • Обработка UILocalNotification в UIViewController с использованием NSNotification после того, как приложение было завершено
  • Flip ViewController, но поддерживайте тот же NavigationController со Storyboard
  • MKMapView autorelease не вызывает dealloc после того, как UIViewController выскочил
  • Как нажать с контроллера вида на контроллер навигационного представления, используя метод prepareForSegue?
  • Контроллер просмотра не автоматически поворачивается после отмены интерактивного перехода на увольнение для представленного контроллера представления
  • iOS 8 - Сбой при представлении диспетчера представлений быстро после установки ключевого окна или увольнения и инсталляции другого
  • Связывание нового диспетчера представлений с раскадрой?
  • Как я могу реализовать мини-плейер в Apple Music в своем приложении?
  • Interesting Posts

    Возможны основные анимации с AVAssetWriter?

    При удачном удалении часть заголовка и нижнего колонтитула TableView тоже

    Я не могу захватить снимок экрана WKWebView

    Swift Timer () не будет обновлять метку после переключения между видами

    Изменение размера UITableView для соответствия содержимому

    Скопировать папку (с содержимым) из пакета в каталог Документы – iOS

    Как я могу проверить, находится ли CLLocationCoordinate2D внутри четырех CLLocationCoordinate2D Square? в Objective C с помощью Google Maps

    показать textField в alertController в swift

    Как синхронизировать события на iOS с EventKit на нескольких устройствах

    Полностью отключите Firebase / Analytics, чтобы остановить консольный спам при запуске приложения.

    Ошибка в Xcode – предупреждение: все приложения должны включать в себя архитектуру armv7 (текущий ARCHS = "")

    iPhone приложение – первоначальная невосприимчивость к iOS 6 на iPad

    Получение всех контактов в ios Swift?

    React Native: как использовать require (path) с динамическими URL-адресами?

    Objective C – Пользовательский метод struct 'make' похож на CLLocationCoordinate2DMake

    Давайте будем гением компьютера.