본문 바로가기
iOS/이슈

[iOS Issue] loadView override시 view가 생성되지 않는 문제

by Sky Titan 2024. 11. 10.
728x90

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

 

loadView() | Apple Developer Documentation

Creates the view that the controller manages.

developer.apple.com

ViewController에서 view를 load해올 때 실행되는 loadView함수와 관련된 문제이다.

 

 사실 '문제'라고 하기엔 그냥 apple이 의도한 사항인 것 같긴 하지만 내가 알고 있던 개발 상식으론 선뜻 동작구조가 이해가 되지 않는 일이라 문제라고 지칭했다.

 

 일반적으로 ViewController의 view를 만드는 방법은 크게 2가지이다.

  1. code로 View짜기
  2. xib로 View짜기

 문제가 되는 부분은 2번 xib로 View짜기 일 때이다.

 

 아래 가이드 문서를 읽어보면 xib로 view를 만들 땐 loadView 함수를 override하지 말라고 되어있다.

 

 근데 난 이 'must not'의 의미를 '굳이 그럴 필요 없다.' 정도의 의미로 해석했지 '하면 큰일 난다'의 의미로 해석하진 않았다.

 

이제 xib로 view생성 시 loadView를 override하면 발생하는 상황을 보자

아무 것도 안 뜬다. 그냥 view가 load되지 않은 거다.

super.loadView를 호출하지 않은 거냐고 할 수 있지만 아니다. 호출 했다.

import UIKit

class ViewController: TSViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func loadView() {
        super.loadView()
    }
}

 내가 아까 말했던 동작구조가 이해되지 않는다는 의미가 이 부분 때문이었다. super.loadView()를 호출함으로써 super class와 동작을 일치 시켰음에도 불구하고 view가 load되지 않는다는게 이해가 되지 않았다.

 

 이 현상 때문에 loadView함수에 모니터링과 관련된 솔루션 장착을 하지 못하는 불상사가 생겼다. 대신에 loadView를 swizzle을 하면 정상적으로 동작하긴 하는데, 알다시피 swizzle자체가 OS가 업데이트 시 어떤 이슈가 발생할지 모르는 리스크가 있기 때문에 권장되진 않는다.

 

Appendix

 찾아보니 objective-c로 가면 selector를 이용해서 현재 호출되는 함수가 override되었는지 알 수 있는 방법이 있는 듯한데 굳이 이렇게 구현을 한 의도는 여전히 잘 모르겠다. 뭐 어쨌든 제작자의 의도가 그렇다니 의도에 맞게 사용해주자.

 

Check if subclass overrides a method

Is it possible to check whether a subclass implements a method that exists either in its immediate superclass or in some superclass of its superclass, etc? E.g. I subclass UIView, to make my custom

stackoverflow.com

 

728x90

댓글