일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Reference Cycle
- Input Output
- 면접을 위한 CS전공 지식 노트
- SWIFT
- 롤케이크 자르기
- 테이블뷰 나누기
- 면접을 위한 CS 전공 지식 노트 Tree
- Carousel CollectionView
- Array vs Linked List
- til
- retain cycle
- 자료구조
- tableview section별 다른 cell적용
- firebase
- @escaping
- UIKit
- NavigationSearchBar
- 프로그래머스
- class struct
- CarouselCollectionview
- UserDefaults
- wil
- Value Type Reference Type
- TableView Section
- CoreData
- 양궁대회
- TableView
- coremotion
- 강한 참조 순환
- ReferceCycle
- Today
- Total
개발하는 동글 :]
[TIL],[UIKit],[UIViewController],[ViewController의 생명주기] 본문
Why?
memo app을 따라 만들어 보며 메모를 삭제하였을 때 하단의 메모 개수가 변경되지 않는 문제가 발생한 적이 있다
이러한 문제를 해결하는 과정으로는 해당 뷰의 viewWillAppear 메서드에 tableview와 collectionview, toolbar를
업데이트 및 다시 할당을 하니 문제를 해결 할 수 있었다.
그렇기에 viewWillAppear 메서드는 무엇이며 UIViewController에 어떠한 메서드와 프로퍼티가 있는지 확인해 봐야겠다는
생각이 들었다.
override func viewWillAppear(_ animated: Bool) { // 화면이 새롭게 그려질 때마다 호출됨
myTableView.reloadData()
myCollectionView.reloadData()
self.toolbarItems = makeToolbarItems()
dataManager.setData()
}
TIL
1. UIViewController의 선언
먼저 Jump to Definition 을 통해 UIViewController를 살펴보자
@available(iOS 2.0, *)
@MainActor open class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment
선언부를 보니 생소한 키워드 들이 몇 가지가 보인다. 그 용어들부터 정리해 보자
- @available(iOS 2.0, *)
- 함수, 클래스, 프로토콜 앞에 사용 타입 또는 프로토콜이 적용되는 플랫폼 및 OS를 나타낸다
- #available과 다르게, 컴파일타임에 경고 또는 오류를 생성합니다. ->컴파일 시 버전이 안 맞다는 오류 메시지 같은 거!
- @MainActor
- 실행기가 메인 디스패치 큐와 동등한 싱글톤 관여자라는 뜻
그럼 UIViewController는 iOS 2.0 버전부터 사용이 가능하며 실행기가 메인 디스패치 큐와 동등한 싱글톤이라는 뜻이다
(-실행기가 메인 디스패치 큐와 동등한 싱글톤 관여자에 관한 부분은 따로 공부가 필요할 것 같다.)
그리고 UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment
이러한 것들을 상속 혹은 채택하고 있다.
2. 내부의 프로퍼티
나중에 사용하게 될 것 같은 프로퍼티만을 정리해 보자
open var view: UIView!
// 자주 사용하는 기본 뷰
open var viewIfLoaded: UIView? { get }
//뷰 컨트롤러의 뷰 또는 뷰가 아직 로드되지 않은 경우 nil
@available(iOS 3.0, *)
open var isViewLoaded: Bool { get }
//뷰가 로드 되었는지의 Bool값
open var nibBundle: Bundle? { get }
//뷰 컨트롤러의 nib 파일(지정된 경우)의 이름 지정하지 않아도 무언가 나오긴 함?
//ex) Optional("BYZ-38-t0r-view-8bC-Xf-vdC")
@available(iOS 5.0, *)
open var storyboard: UIStoryboard? { get }
//뷰 컨트롤러가 시작된 스토리보드입니다.
open var title: String?
이 컨트롤러가 관리하는 title을 나타내는 문자열입니다.
weak open var parent: UIViewController? { get }
// 이 컨트롤러의 상위 뷰를 보는 것
3. ViewController의 Life Cycle
loadView
view controller가 관리하는 view를 만든다
loadView가 뷰를 만들고, 메모리에 올린 후에 viewDidLoad가 호출
이 메서드를 직접 호출하면 안 됨 (self.loadView() X, super.loadView() O)
view controller에 관련 nib 파일이 있는 경우 nib 파일에서 view를 로드
view controller에 연결된 nib 파일이 없으면 대신 일반 개체 만듦
viewDidLoad
호출 시점: view controller가 메모리에 로드되고 난 후
view의 로딩이 완료되었을 때 시스템에 의해 자동으로 호출되기 때문에
일반적으로 리소스를 초기화하거나 초기 화면을 구성하는 용도로 주로 사용
viewWillAppear
호출 시점: view가 view 계층 구조에 추가되기 전과 view를 표시하기 위해 애니메이션이 구성되기 전
view가 나타나기 직전에 호출
view에 나타내는 것과 관련된 작업을 수행할 때 사용
viewDidAppear
호출 시점: view가 화면에 나타난 직후에 실행
view가 나타났다는 것을 controller에게 알리는 역할
화면에 적용될 애니메이션을 그려줌
viewWillDisappear
호출 시점: view 계층 구조에서 view가 제거될 때
view가 실제로 제거되기 전과 애니메이션이 구성되기 전에 호출
viewDidDisappear
호출 시점: view 계층 구조에서 view가 제거되었음을 view controller에 알림