동일 레벨의 화면전환 방식과 모달의 동작방식에 관한 질문

  1. master- detail이 아닌 동일레벨의 화면전환을 할때 어떤 방법을 사용해야 하나요?
    저희가 생각한 방법은 modal로 full 스크린이 나오도록 하는 것이라 생각하였는데, 혹시 보다 좋은 방법이 있을까요?

  2. 동일레벨의 화면전환을 할 때 어떤 UI로 해야할까요?
    현재는 세그먼트컨트롤바를 사용하여, 조작하고 있습니다.

  3. 모달의 동작방식에 관한 질문.
    저희는 세그먼트 컨트롤바가 사용자에 의하여 조작이 되었을 때 작동하는 함수를 아래와 같이 작성하였습니다. 모달이 늘어나서, 앱이 무거워지는 것을 방지하고자 아래와 같이 presentingView를 구하고, 존재할때만, 아래의 처럼 dismiss를 해주었습니다.

@IBAction func _changeMenu(_ sender: Any) {
           self.definesPresentationContext = true
           let nextMenu = menus[subNavigation.selectedSegmentIndex];
           if let nextView = self.storyboard?.instantiateViewController(withIdentifier: nextMenu){
               //nextView.modalPresentationStyle = .fullScreen
               guard let pvc = self.presentingViewController else {
                   nextView.modalPresentationStyle = .currentContext
                   self.present(nextView, animated: false, completion: nil)
                   //print("no presentingViewController")
                   return
               }
               //print(pvc)
               self.dismiss(animated: false){
                   //print("yes!!")
                   nextView.modalPresentationStyle = .currentContext
                   pvc.present(nextView, animated: false, completion: nil)
               }
           }    
       }

PresentationStyle을 currentContext로 하고, definesPresentationContext을 옵션을 설정함으로서 아래의 탭바가 계속 유지되도록 하였고, 한개의 탭에서는 잘 작동하는 것을 확인하였습니다. 그러나 현재탭에서 세그먼트컨트롤 바를 조작하여 모달이 생성된 상황에서 다른 탭을 클릭하고 해당 탭에서 세그먼트 컨트롤 바를 조작하면 앱이 죽어버립니다. dismiss에서 뭔가 문제가 생긴 것 같은데, 에러 사항은 다음과 같습니다.

2020-05-03 13:49:31.222498+0900 Dr-Soldier[47694:2535503] Warning: Attempt to present <Dr_Soldier.BodyChartViewController: 0x7fd6de619ec0> on <Dr_Soldier.FitnessViewController: 0x7fd6de40a5e0> whose view is not in the window hierarchy!

모달이 올라간 상태로 다른 탭을 눌렀을때 계층구조가 이상해지는것 같은데, 이러한 경우 어떻게 해결하면 될까요?
현재 스토리보드는 다음과 같이 구성되어있습니다.

좋아요 2

1번에 제 생각을 적어보자면 (정답이 아닐 수 있습니다!!!) 동일 level에서는 Hig에서 보여진 생각으로 Flat navigation을 쓰면 좋지 않을까요?? 이것은 이제 게시글이 나올 때 다음 게시글을 보고싶을 때 Next Page라는 버튼을 그리고 이전 페이지를 보고 싶을 때 Prev Page를 통해 구현 할 수 있겠네요 이것은 현재 아이폰에서도 많이 쓰이는 것으로 알고 있습니다

좋아요 2

먼저 전환하고자 하는 뷰들이 동일레벨인지를 확인해야 합니다.
아마도 동일 레벨이 아니라 데이터상의 종속 개념이 있을 듯 한데 그걸 동일 레벨이라고 생각하고 있지 않을까 싶어요.

동일레벨이라면, 탭 바 나 세그먼티드 컨트롤로 전환을 하는 게 맞습니다.
지금 생각하고 있는, 모달로 모든 뷰를 올리는 건 번거롭기도 하고, 사용자를 헤매게 만들 수 있을 것 같아요.

보통, 안드로이드를 사용하는 분들이 뷰 흐름을 잡을 때, 메뉴를 중심으로 한 방사형 구조를 많이 떠 올리는데요,

데이터의 종속 관계를 따져보면 웬만한 경우, @jihunjeong219 님이 설면한 것 처럼
탭 바 안에 네비게이션 바로 설계 가능합니다.

데이터의 종속 개념은 없고, 동일 레벨입니다! 저번에 이재훈강사님이 저희팀에 피드백을 해주실때 동일레벨을 네비게이션 컨트롤러로 전환하는건 HIG에 위반되고, 뷰를 바꿔치기?? 하시라고 하셨습니다. 저희가 정확히 이 바꿔치기를 어떻게 구현해야하는지 몰라서 모달방식으로 일단 구현해봤습니다. 모달은 항상 생성될때 아래 모달을 dismiss하는 방식으로 구현하여 모든 뷰가 중첩해서 올라가지 않습니다. 풀스크린으로 애니메이션없이 조작되기 때문에, 사용자는 모달방식이 사용되는지 조차 모를 것입니다. 모달방식이 말고 다른 바뀌치기 방식이 있을까요?