본문 바로가기

iOS (스파르타)

네비게이션 바,, 안보이게 하기..!

과제를 하면서 모달화면 안쓰고 네비게이션컨트롤러 사용하려고 하는데 엄청난 어려움을.. 겪었고,,

나 진짜 지식이 넘 부족하고 개념이 없구나 싶어서 열심히 찾아봤는데 일단 이건 과제걔기니까 미뤄두고,,

 

어쩌다 네비게이션컨트롤러를 원하게 사용하게됐는데

특정 뷰에서 네비게이션 바가 안보이길 원했다!

하지만 그건 안해봤는걸?

 

이게 찾아보니 setNavigationBarHidden 이라는게 있었고,, true 를 사용해주면 바가 숨겨지더라!!!!

 

근데 또다시 문제점은!

그 특정 뷰컨에서 다른 뷰컨을 쌓았다가 돌아가면 다시 네비게이션 바가 노출이 되는것이다!!!!

 

그 문제는 바로..

viewDidLoad 때문이었음!

제가 찾아본 블로그에서 뽀려왔어요

사진에서 보면 viewDidLoad는 메모리에서 삭제되지 않으면 계속 남아있고, 삭제해줄때까지 다시 재생되지 않는다

viewWillAppear은 메모리에 뷰가 있다면 호출이 된다.

 

즉, viewDidLoad는 처음 로딩될 때 1회 호출이 되는 것이고 viewWillAppear은 매번 뷰가 다시 보일 때마다 실행된다.

 

그래서 viewDidLoad를 사용하면 다른 뷰컨을 호출했다가 다시 호출했을때 네비게이션바 숨긴게 다시 뿅 나타나게 된다..ㅎ

사실 정확히 무슨말인지 이해가 좀 어렵긴 하다 ㅋㅋㅋ 더알아보겠다,,

 

처음에 저렇게 해서 

override func viewWillAppear(_ animated: Bool) { 
   super.viewWillAppear(animated); 
   navigationController?.setNavigationBarHidden(true, animated: true) }

이렇게 작성해줬더니 저 뷰컨위로 쌓이는 뷰컨에서도 네비게이션 바가 안보이더라,,!

그래서 쌓이는 뷰컨에가서 똑같은 적어주고 Hidden을 false 로 바꿔주었다.

그랬더니 뜨는데

 

더 찾아보니 안보이게하는 뷰컨에서 viewWillDisappear을 통해서 뷰가 화면에서 사라질 시점에 네비게이션바를 다시 보이도록 설정해줄수 있었다!!!

 

그 코드들을 참고해서

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisapppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

요렇게 한 뷰컨에 작성해주는 걸로 바꿨는데 얘는 super. 이 빠졌네?

super은 부모 클래스를 참조하는 키워드로,.,

부모클래스의 라이프사이클 메서드를 재정의할때는 반드시 부모클래스의 구현을 호출해야 된다는데!

호출해주지 않으면 예상하지 못한 문제 발생할수 있단다..

그래서 viewWillAppear(_:) 하고 viewWillDisappear(_:)을 재정의 할때는

반드시! super.viewWillAppear(animated) 와 super.viewWillDisappear(animated)를 호출해야한다!

 

그렇게 또 바꾼 코드

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated) // 부모 클래스의 메서드 호출
        navigationController?.setNavigationBarHidden(true, animated: animated)
    }
    
        override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated) // 부모 클래스의 메서드 호출
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
    }