본문 바로가기

Swift

NavigationBar의 Hidden / Show 전환

(UPDATE: 5시간 가량의 삽질 후 알게된 내용)

이 현상은 Main.Storyboard의 버그라고 생각된다. 상세 원인은 이 글 제일 아래에 작성하였다.


겁나 간단한 개념인데 이게 잘 안 된다.

하고 싶은 것은 View 1 -> 2 -> 3 -> 4가 있는데 View1에서는 NavigationBar가 보이고 View2에서 hidden이 되었다가 3, 4에서는 다시 보여지는 것이다.


1. View1

당연히 View1에서는 Navi Bar가 잘 보여진다.


2. View2

viewDidLoad() 에서 self.navigationController?.setNavigationBarHidden(false, animated: true)

를 주거나 아예 이 문장을 넣지 않은 상태에서

viewWillAppear()에서 self.navigationController?.setNavigationBarHidden(true, animated: true)

를 주면 제대로 View2에서는 Navi Bar가 보여지지 않는다.


만약 반대로 한다면?

viewDidLoad() 에서 self.navigationController?.setNavigationBarHidden(true, animated: true)

viewWillAppear()에서 self.navigationController?.setNavigationBarHidden(false, animated: true)

로 설정하면 아래와 같이 Navi Bar가 살아있는 것을 확인할 수 있다.

아무튼 View2에서 처음 설정대로 하여 Navi Bar가 안 보이게 한 상태에서


3. View3

여기가 문제다. viewDidLoad(), viewWillAppear() 모두 self.navigationController?.setNavigationBarHidden(false, animated: true)로 설정하여도 Navi Bar가 절대로 나타나지 않는다.

그 이유는 self.navigationController가 nil이기 때문인 것으로 생각된다.


이유를 알았다. View3이 호출되는 segue 설정에서 show가 아닌 show detail을 선택했기 때문이었다.

Main.Storyboard에서도 show/show detail을 전환하면 Navi Bar가 나왔다가 사라졌다 하는 것을 확인할 수 있다.


헐.. 이거 문제다..

View2를 다시 보여주면 안 되는 상황이라 show detail을 사용한 것인데 우짜쓰까??


곰곰히 생각한 끝에 show detail을 사용하지 않고 show를 사용하는 것이 맞다고 판단하게 되었다. 그러나 show를 사용해도, 겉보기에는 아무 이상이 없는데 여전히 Navi Bar는 나오지 않는다.


그러다가 우연히 Segue만 지웠다가 다시 만들었더니 제대로 원하는 대로 작동하는 것이 아닌가?! 소스 변경한 것은 하나도 없는데.. 분명 Main.Storyboard의 내부 코드가 문제를 일으키는 것 같지만 확인할 방법이 없었다.

그러다가 생각난 것이 소스 커밋하며 변경 사항을 확인하는 방법이 떠올랐다.


이 방법을 이용하여 변경 내용을 확인해보니 아래와 같은 차이점이 있음을 발견하였다.


역시 예상대로 segue type을 "show detail"에서 "show"로 바꾸면서 내부 코드가 제대로 변경되지 않아 발생한 것이었다.

이래서 Main.Storyboard의 사용을 최소화해야 한다는 느낌이 나를 강력하게 사로잡는다.