[iOS] 오늘의 삽질

2 분 소요

사람은 누구나 실수를 한다.

특히 나는 코드상에서 실수가 잦다. 코드상에서..

나의 경우 코드상의 실수를 잘 찾지 못하는 편이다.

그래서 코드리뷰가 필요하고들 한다.

그러나 혼자 하는 작업에서 코드리뷰를 하기란 쉽지 않다. 코드를 공유할 수 없는 프로젝트의 경우 더욱더 그렇다.

때문에 나는 며칠간의 삽질을 했다.

이 글은 나중에라도 혹시 같은 실수를 반복하지 않기 위해서 반성의 의미로 남겨둔다.

1.

앱의 구조는 다음과 같다.

UITabBarController
|
|--UINavigationController
|
|----HomeViewController (UIViewController)
|
|------DetailViewController (UIViewController)
|
|--UINavigationController
|
|----UIViewController

...

이런 식이다. 굉장히 일반적인 형태이다.

이 형태의 구조에서 첫 번째 UINavigationController 의 UIViewController 가 보일 때 UINavigationBar를 숨기고 싶었다.

home에서 detail로 이동될 때는 UINavigationBar 가 다시 보이고,

detail에서 home으로 돌아올 때는 다시 UINavigationBar를 숨겨야 한다.

2.

간단하게 viewController의 life cycle을 고려해서 다음과 같이 코드를 작성했다.

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

상세 화면으로 이동할 때 는 Storyboard Segue를 사용했기 때문에 아래와 같이 작성했다.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let id = segue.identifier {
        if id == "detail" {
            self.navigationController?.setNavigationBarHidden(false, animated: true)
        }
    }
}

UINavigationBar는 정상적으로 사라지고 나타났다.

iOS의 edge swipe기능도 문제 없이 동작했다.

그 후

UITabBarController 에 커스텀 스킨을 입히고,

UINavigationnBar와 UITabBar에 특정 기능들을 입혔다.

NavigationBar에 BackButton도 커스터마이징 했다.

한참을 작업을 진행하다 앱을 디바이스에서 실행해 보니 한 가지 문제가 발견 됐다.

최초에 HomeViewController가 로드 됐을 때, UINavigationBar바로 아래 있던 UIView가 Status Bar와 겹쳐보이는 문제였다.

얼핏 보기에는 UIView의 상단 constraint가 safeArea에서 벗어난 듯이 보였다.

상세 화면으로 이동했다가 다시 돌아왔을 때, UIView가 다시 정상적으로 이동되어있었다.

처음 보는 증상이었다.

약간 당황스러웠지만 할 게 많으니 우선 잠깐 미뤄두고 다른 작업을 먼저 진행했다.

자다가 왜 그럴까도 생각해 보고 이래저래 검색도 해봤지만 뚜렷하게 뭐가 잘못되었는지를 알 수 없었다.

3.

viewDidLoad에서 해당 UIView의 constraint를 강제로 바꿔봤다.

일단 해결된 듯이 보였다.

하지만 이 화면에 적용된 다른 기능 때문에 UIView하단에 있던 UITableView의 scroll Inset이 틀어지기 시작했다.

이 방법은 아닌 것 같다.

3일째 되는 날, 새로 프로젝트를 만들어 같은 구조로 앱을 새로 짜 봤다.

기존 프로젝트와 최대한 비슷한 환경으로 맞추고, 코드와 Storyboard상의 UIView들을 복사해서 붙여넣고 디버깅을 했다.

그런데 새로 만든 프로젝트에서는 굉장히 정상적으로 보이는 게 아닌가?

의아했다…..

왜 그럴까..

4.

기존 프로젝트로 돌아와서 해당 UIViewController에 지정되어있던 custom class를 해제한 뒤 실행해 봤다.

정상이였다.

이제 다시 custom class를 지정한 뒤, 모든 코드를 주석 처리 하고 한줄 한줄 주석을 풀며 디버깅을 했다.

그러다 발견한 코드…

super.viewWillDisappear(animated)

……

viewWillAppear메서드에서 UIViewController에 viewWillDisappear를 호출하고 있었다.

이 라인을 수정하고 나니 거짓말처럼 증상이 사라졌다.

굉장히 허탈하고 말이 안 나왔다.

이런 실수를 하다니….

정확히 왜 저 라인이 그런 증상을 발생시키는지는 조금 더 찾아봐야 할 것 같다.

viewWillDisappear를 호출하면 사라질 UIView에 대해서 어떤 처리를 하는 건가..?