1. 상황 설명
✔️ xib 방식으로 구현되어 있던 UI를 Code-based 방식으로 바꿔주는 과정에서 ViewController.xib 파일을 삭제했고,
UIView 파일을 새로 만들어 재구현한 다음
기존의 ViewController.swift 파일에서 loadView() 함수를 오버라이딩해서 넣어주었다.
import UIKit
final class NoticeViewController: BaseViewController {
// MARK: - Properties
private let emptyView = EmptyView()
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tabBarController?.tabBar.isHidden = false
}
override func loadView() {
super.loadView()
view = emptyView
}
override func style() {
super.style()
view.backgroundColor = Color.gray150
}
}
✔️ 루트 뷰 컨트롤러로 지정해 주었다.
window?.rootViewController = UINavigationController(rootViewController: NoticeViewController.instanceFromNib())
2. 문제 발생
빌드하면 아래의 메세지와 함께 크러쉬가 발생하는 것이었다.
3. 해결
일단 해석 ...
Could not load NIB in bundle ' ~생략~ (loaded)' with name 'NoticeViewController'
→ NoticeViewController라는 이름을 가진 NIB을 로드할 수 없음
왜 로드할 수 없을까 ??
✔️ 다른 뷰컨트롤러 파일들과 하나씩 비교해봤다.
→ 속성 부분에서 TextSetting이 No explicit Encoding이 아닌 UTF-8로 되어 있는 것을 발견
→ 뷰컨트롤러를 삭제하고 다시 만들어줌 → 여전히 같은 오류 발생
✔️ 로드에 대해서 경고하고 있으니까 loadView() 함수를 없애야 할 것 같지만, 이건 뷰를 불러와야 하기 때문에 필요한 부분임 → 함수블럭 내의 super.loadView()를 지워봄 → 오류 해결
????
4. 공식 문서 읽기
정의는 이렇다.
loadView()
- 컨트톨러가 관리하는 뷰를 만드는 함수이다.
- 직접적으로 호출하면 안 된다.
- 뷰를 로드하거나 생성하여 뷰 프로퍼티에 할당한다.
자세한 설명을 읽어보자.
✔️ 밑줄 그은 것 위주로 정리하자면,
1. 뷰 컨트롤러가 연관된 nib 파일을 가지고 있는 경우, 그 nib 파일로부터 뷰를 로드한다.
2. 화면으로 구성하는 방식(스토리보드, xib)에서 뷰 컨트롤러를 인스턴스화 시키려면
nib 파일을 init(nibName:bundle: ) 메소드를 이용해 할당한다.
3. 뷰 컨트롤러에 연관된 nib 파일이 없는 경우 대신 UIView 객체를 생성한다.
4. 생성한 뷰는 고유한 객체여야 하며, 다른 뷰 컨트롤러 객체와 공유되면 안 된다.
5. 사용자 정의 시 super로 호출하면 안 된다.
아하...
→ SceneDelegate에서 뷰컨트롤러를 인스턴스화 해주는 과정에서 nib을 찾는데 존재하지 않아서 발생한 문제였군
→ 그리고 super로 호출하면 안 되는군
전자는 이해가 가지만 후자는 아직 약간의 의문이 남아있다.
재정의 해주는 것이기 때문에 필요한 부분이라고 생각했는데, 이건 뷰를 로드하는 것이기 때문에 계층적인 문제로 가는 걸까...?
혹시 검색하다가 들어오신 분들이 계시다면 많은 의견 부탁드리며... 마무리! 🤓
해결했습니다~~ 아래의 게시글을 참고 해주세요!
https://osoomoovo.tistory.com/206
'개발 > iOS' 카테고리의 다른 글
[Swift] ARC, Retain Cycle, weak, unowned (2) | 2022.02.22 |
---|---|
[iOS] CollectionView의 extension으로 EmptyView 만들기 (0) | 2022.02.19 |
[iOS] UITableViewCell에 유동적인 행 높이 지정하기 (동적으로 높이 조정하기) (0) | 2022.02.12 |
[iOS/Swift] Closure에 대해 알아보자 (2) | 2022.02.08 |
[iOS] GCD에 대해 알아보자 (4) | 2022.02.04 |
댓글