2016-11-14 4 views
1

나는 (하단 메뉴가있는) 탭 막대 컨트롤러와 최상위 메뉴가 있습니다. 문제는 노란색과 녹색보기를 탭 막대에 연결하지 않으려한다는 것입니다. 사용자가 아래 메뉴가 아닌 최상위 메뉴를 사용하여보기를 변경하기 때문입니다.탐색 스택에 이미있는보기 컨트롤러 표시

버튼을 클릭 할 때마다 뷰의 새 인스턴스가 스택 될 것입니다. (따라서 V1 -> V2 -> V3 -> V2 -> V4와 같은 것을 갖게됩니다.

내 부분적인 해결책 이런 식으로 뭔가를 만드는 것입니다)에 :

@IBAction func yellowViewButtonAction(_ sender: AnyObject) 
{ 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController 

    if let viewControllers = navigationController?.viewControllers { 
     for viewController in viewControllers { 
      // some process 
      if viewController is YelloViewController { 
       print("View is on stack") 
      } 
     } 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController 
     self.navigationController?.pushViewController(controller, animated: false) 
    } 
} 

나는 for 내부의 iftrue 때문에보기가 탐색 스택에있는 것을 볼 수 있습니다. 문제는 동일한 뷰의 새 인스턴스를 푸는 대신에 어떻게 검색 할 수 있습니까? (왜냐하면이 거대한 기억 문제 외에 내가보기에 가지고있는 어떤 데이터도 잃어 버리기 때문이다).

스택의 모든 내용을 그대로 유지하려고합니다.

예 :

V1 -> V2 -> V3 -> V4 (현재보기)

나는 여전히 탐색 컨트롤러에 V4, V3 및 V2를 갖고 싶어 V4에서 V1로 돌아갈 경우 스택.

또 다른 질문은이 해결책이 애플이 거절 할 수있는 것이라면 말입니다.

감사합니다. 사용 및 탐색 컨트롤러를 필요로하지 않는 것처럼

enter image description here

답변

1

보인다. self.navigationController?.pushViewController(controller, animated: false)에 전화 할 때마다 해당 컨트롤러의 새 인스턴스가 스택됩니다.

당신이 탐색 한 뷰 컨트롤러에서 popViewController를 호출하는 것이 가장 이상적입니다. 탭 표시 줄 컨트롤러의 사용자 지정 동작을 만들 때 내 생각에 적어도 네비게이션 논리를 정확히 계획하기가 어렵습니다.

이와 같은 경우에 저는 보통보기 컨트롤러를 수동으로 숨기려고합니다.

@IBAction func didPressTab(sender: UIButton) { 
     let previousIndex = selectedIndex 
     selectedIndex = sender.tag 
     buttons[previousIndex].selected = false 
     let previousVC = viewControllers[previousIndex] 
     previousVC.willMoveToParentViewController(nil) 
     previousVC.view.removeFromSuperview() 
     previousVC.removeFromParentViewController() 
     sender.selected = true 
     let vc = viewControllers[selectedIndex] 
     addChildViewController(vc) 
     vc.view.frame = contentView.bounds 
     contentView.addSubview(vc.view) 
     vc.didMoveToParentViewController(self) 

    } 

모든 '내비게이션 버튼'에는 고유 한 ID가 있으며 통화는 didPressTab 기능을 수행합니다.

사실이 튜토리얼에서이 배운 : https://github.com/codepath/ios_guides/wiki/Creating-a-Custom-Tab-Bar

+0

나는 내가 노란색 및 녹색 뷰를 누르면 다음 난 아직 바닥 바 메뉴를 볼 수 있기 때문에 탐색 컨트롤러를 필요합니까. 내가보기를 그대로 유지하겠다고 말했듯이, 내가 팝업을하면보기의 모든 데이터가 손실됩니다. – Adrian

+0

하단 메뉴 막대를 보려면 탐색 컨트롤러가 필요 없습니다. 링크의 튜토리얼을 보시면 알 수 있습니다 :) 또한 뷰 컨트롤러의 '내부'상태가 그대로 유지되도록 필자가 제공 한 코드는 뷰만 이동합니다. – repoguy

+0

내가 말하고자하는 것은 내가 이미 하나 있기 때문에 사용자 정의 하단 메뉴 막대를 원하지 않는다는 것입니다. 내비게이션 컨트롤러 스택에있는 뷰 사이를 바꿀 수 있어야합니다. – Adrian