имея методы,

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

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

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

НОТА:

Все переходы на картинке "Шоу"В корзине VC нет кнопки, чтобы показать себя, как другие 3. Таким образом, технически я предотвратил бесконечный цикл покупок в корзине VC - детали продукта / товара VC показывали друг другу.

Мои вопросы:

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

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

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

EDIT2: @beshio

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

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

 beshio15 нояб. 2017 г., 16:19
Привет @Tarek. Я объяснил свой ответ именно так, как говорит ваша диаграмма. На вашем графике нет перехода, возвращающегося к VC1 из любого места. Чтобы добиться этого, нам нужно удалить «путь», чтобы вернуться к VC1. Мой код демонстрирует, как это сделать. Таким же образом вы можете добиться ЛЮБОГО перехода (VC * к VC *), манипулируя стеком навигации, как я продемонстрировал. Пожалуйста, дайте мне знать, если не ясно, как. Лучше обновить график до того, который вам нужен. Еще кое-что. С моим кодом, кнопка «Назад» и пролистывание слева направо работают как вы ожидаете, после того, как вы манипулировали стеком.
 Tarek14 нояб. 2017 г., 00:26
@kirander Я отредактировал мой вопрос с более подробной информацией.
 kirander14 нояб. 2017 г., 00:22
Что такое синий переход? Карта VC закрывается сама или она создает новый VC при срабатывании?

Ответы на вопрос(2)

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

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

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

VC1 до: VC2 (push), VCX (push)VC2 to: VC3 (push), VCX (push)VC3 для: VCX (толчок)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, вы можете легко добиться этого.Этот объясняет как.

 Tarek15 нояб. 2017 г., 14:36
Я отредактировал свой вопрос с ответом на вас.
 R. Mohan17 мая 2018 г., 10:15
Спасибо @beshio, это помогло мне :)

Ваш ответ на вопрос