2017-11-13 2 views
2

enter image description here내비게이션 컨트롤러 루프

장바구니 기능이있는 앱을 만들고 있습니다. 장바구니 VC는 탐색 표시 줄의 단추를 통해 여러 VC에서 액세스 할 수 있습니다. 지금까지는 하나의 내비게이션 컨트롤러 만 있고 이미지에 표시된대로 각 VC가 나를 다음 단계로 안내합니다. 세 번째 VC (파란색 화살표가 가리키는)는 제품/항목의 세부 정보를 보여주고 장바구니에 추가 할 수있게 해주는 VC입니다.

문제는 쇼핑 카트 VC와 함께 제공됩니다. 항목을 편집하려면 이전에 사용한 VC와 동일한 제품/항목의 세부 정보 (파란색 화살표가 가리키는 부분)를 다시 사용하고 싶습니다.

지금 당장은 별다른 문제가 없지만 일단 블루 스그를 만들면 스토리 VC에서 네비게이션 바가 사라지는 것을 보았습니다. 그러나 내가 보았을 때 여전히 볼 수있었습니다. 앱.

참고 : 사진에

  1. 모든 segues는 "연락처보기"
  2. VC가 다른 3가하는 것처럼 자신을 보여줄 수있는 버튼이없는 쇼핑 카트입니다. 그래서 기술적으로 나는 장바구니 VC의 끝없는/루프를 막았습니다 - 제품/품목 세부 사항 VC는 서로를 보여줍니다.

내 질문은 :

  1. 는 인앱 VC 첫 번째 VC로 돌아갈 수있는 또 다른 VC 및 다른 VC에가는 방법을 설계하는 것은 잘못인가? 나는 길을 내려가는 이슈에 직면하게 될 것인가, 아마 어떤 종류의 메모리 누수가있을 것인가?
  2. 달성하려는 목표를 달성하는 더 좋은 방법이 있습니까?

자세한 설명이 필요한 경우 알려 주시면 질문을 수정하겠습니다.

편집 : 명확하게하기 위해, 파란색 세그는 기본적으로 카트 VC의 UITableView에있는 버튼입니다. 버튼을 탭하면 제품/품목 세부 정보 VC가 열리고 항목의 색상 등을 편집 할 수 있습니다. 품목 세부 사항 VC에서 품목을 장바구니에 새 품목으로 추가하는 대신 편집 API에 편집 요청을 보내고 VC를 장 Y 구니에 다시 보내거나 단추를 사용하여 탐색 장 치의 뒤로 단추를 사용하여 장바구니로 돌아갈 수 있습니다.

EDIT2 : @beshio

답변 해 주셔서 감사합니다. 그러나 VC1은 실제로 모든 앱이 시작되는 내 루트 VC입니다. Navigation Controller의 스택에서 제거 된 VC를 얻지 못했습니다. 뒤로 단추가 의도 한대로 작동하게하고 싶습니다.

지금까지 나는 원하는 것을 이루었지만, 두 개의 VC가 서로 엇갈리게하는 것이 문제가 될 수 있습니다. VC3가 장바구니에서 제시된 경우 루프가 막힐 수 있으므로 VC3의 장바구니 버튼을 이미 비활성화했습니다. 나는 길 아래의 메모리 누출에 대해서만 걱정하고 있습니다.

+0

푸른 색 단색은 무엇입니까?cardVC 자체가 닫히거나 트리거 때 새로운 VC가 생성됩니까? – kirander

+0

@kiranderI 내 질문에 대한 자세한 내용을 편집했습니다. – Tarek

+0

안녕하세요 @ Tarek. 귀하의 차트에 나와있는대로 내 대답을 정확하게 설명했습니다. 귀하의 차트는 어디서나 VC1로 돌아가는 전환을 갖지 않습니다. 이를 달성하려면 VC1로 돌아가려면 "경로"를 제거해야합니다. 내 코드는 어떻게하는지 보여줍니다. 같은 방법으로, 내가 보여준대로 네비게이션 스택을 조작하여 ANY 천이 (VC *에서 VC *)를 달성 할 수 있습니다. Pls는 그것이 어떻게 명확하지 않은지 알려줍니다. 차트를 원하는 차트로 업데이트하는 것이 좋습니다. 하나 더. 내 코드를 사용하면 스택을 조작 한 후 원하는대로 뒤로 버튼과 왼쪽에서 오른쪽으로 스 와이프 할 수 있습니다. – beshio

답변

0

굉장합니다.

이 시나리오에서는 많은 컨트롤러가 주기적으로 스택 될 때 스택에 원하는 viewcontrollers를 얻으려면 setViewControllers([UIViewController], animated: Bool)을 사용해야합니다.

다른 방법은 UINavigationController을 갖는 방법에서 파생 된 자신의 클래스, pushToCheckout(animated:Bool), popToEditCart(animated:Bool) , removeIntermediateControllers()

1

그것은이 좀 전환을 달성 할 수있어 쓰기입니다.

여기 차트를 사용하여이를 구현하는 방법을 설명합니다. 차트에 표시된 것처럼 VC1, VC2, VC3 (위에서 아래로) 및 VCX (파란색/파란색 상자)가 있다고 가정하십시오. 전환 및 관련 애니메이션 방향을 정의해야합니다 (오른쪽에서 왼쪽 또는 오른쪽 : 왼쪽에서 오른쪽으로 푸시).차트로, 당신은으로 전환 및 애니메이션을 정의하는 경우 :

  1. VC1에 : VC2 (푸시)
  2. VC2로, VCX (푸시) : VC3 (푸시), VCX (푸시)
  3. VC3 로 : VCX
  4. VCX에 (푸시) : VC3 (팝업)

및 가정 우리는, 다음, 이미 인스턴스화 뷰 컨트롤러의 모든이

    ,369 1,363,210
  • VC1로 VC2 전이

에 VC1 : VC2에

navigationController!.pushViewController(VC2, animated: true) 

:

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 VC1에 VCX 전이

행 :

,745,151 5,VCX에서
navigationController!.pushViewController(VCX, animated: true) 

: (A) VC2로 VC3 전이

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에

    navigationController!.pushViewController(VC3, animated: true) 
    

    (B)

    VCX에서

    navigationController!.pushViewController(VCX, animated: true) 
    

    : VC2에 VCX 전이

-는

  • VC2

    • VCX VC3 전이

    에 (A)와 동일 ~에서 VCX : VC3에서

    navigationController!.popViewController(animated: true) 
    

    : (B)와 같은 사용자가 슬쩍 때

    참고 viewDidAppear가 호출 (왼쪽에서 오른쪽으로) 돌아갑니다과에 == (가는 길에 슬쩍 그것을 다시 취소 왼쪽). 따라서 viewDidAppear에서 더 작은 코드가 필요합니다.

    다른 애니메이션 방향을 원한다면 스택을 조작하고 푸시/팝을 사용하면 쉽게 얻을 수 있습니다. This에 대한 설명이 나와 있습니다.

+0

내 질문에 대한 답을 편집했습니다. – Tarek

관련 문제