Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리펙토링
- MVVM
- ios
- uiscrollview
- clean architecture
- swiftUI
- map
- Xcode
- collectionview
- Human interface guide
- ribs
- tableView
- swift documentation
- Protocol
- UITextView
- SWIFT
- rxswift
- HIG
- uitableview
- Clean Code
- 리펙터링
- RxCocoa
- Observable
- Refactoring
- 스위프트
- 애니메이션
- UICollectionView
- combine
- 클린 코드
- 리팩토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] container view 사용 방법: addChild, addSubViews, didMove, willMove, revmoveFromSuperview, removeFromParent 본문
iOS 실전 (swift)
[iOS - swift] container view 사용 방법: addChild, addSubViews, didMove, willMove, revmoveFromSuperview, removeFromParent
jake-kim 2020. 11. 20. 22:34UIViewController들을 부모-자식 관계로 이용?
A ViewController가 있을 때, A밑에 B ViewController가 존재하게 하는 방법?
자식으로 설정: parent 입장에서 설정
A.addChild(B)
A.view.addSubview(B.view)
B.didMove(toParent: A)
- parentVC.addChild(childVC): 특정 ViewController를 현재 ViewController의 자식으로 설정
- parentVC.view.addSubview(childView): 추가된 childVC의 View가 보일 수 있도록 맨 앞으로 등장하게 하는 것
- childVC.didMove(toParent: parentVC) / willMove
: childVC입장에서는 언제 parentVC에 추가되는지 모르기 때문에, childVC에게 추가 및 제거 되는 시점을 알려주는 것 (willMove / didMove: 추가되기 전, 추가된 후)
자식관계 해제: 자식 ViewController입장에서 설정
B.willMove(toParent: nil) // 제거되기 직전에 호출
B.removeFromParent() // parentVC로 부터 관계 삭제
B.view.removeFromSuperview() // parentVC.view.addsubView()와 반대 기능
- childVC.willMove(toParent: nil): container view로 부터 제거되기 전에 불려져야 하는 함수
- childVC.removeFromParent()
- childVC.view.removeFromSuperview()
addChild, removeFromParent, didMove, willMove, 사용하는 이유
- addChild / removeFromParent: ViewController들은 children property를 갖는데, children 배열에 삽입되어 마치 navigationController처럼 child를 관리하기 쉽도록 내부적으로 제공해주는 프로퍼티 children배열에 저장하는 것 (추후에 child 사용을 대비하여 넣어놓는 것)
private func addContentsView() {
print(children) // []
addChild(contentTableView)
contentTableView.view.frame = containerView.frame
containerView.addSubview(contentTableView.view)
contentTableView.didMove(toParent: self)
print(children) // [<ContainerViewEx.MyTableViewController: 0x7f9312712550>]
}
- didMove / willMove: viewController들은 didMove(toParent:), willMove(toParent:)라는 함수를 viewWillAppear과 같이 viewController의 생명주기에서 부모가 생긴 경우 특정 이벤트를 처리해야 하는 경우, 아래와 같이 override하여 추후에 처리할 것을 대비하여 didMove / willMove를 호출해주는 것
override func didMove(toParent parent: UIViewController?) {
super.didMove(toParent: parent)
print("MyTableViewController didMove 호출 parent(\(parent)) !!!")
}
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
print("MyTableViewController willMove 호출 parent(\(parent)) !!!")
}
- add할때 willMove만 따로 명시적으로 호출하는 이유: add할때 addChild()에서 내부적으로 willMove만 호출
- 뷰가 추가된 후 특정 작업들을 해야할것이 있다면 끝낸 후 didMove(toParent:)를 타이밍에 맞게 호출될 수 있게 하기위함
- remove할때 willMove만 따로 명시적으로 호출하는 이유: remove할때 removeFromParent()에서 내부적으로 didMove만 호출되고 willMove는 호출되지 않는 형태
- viewController가 제거되기 전에 작업해야할 것들을 준비 후 willMove(toParent:nil)을 타이밍에 맞게 호출될 수 있게끔 하기위함
* 자식 참조는 A.children로 접근
'iOS 실전 (swift)' 카테고리의 다른 글
[iOS - swift] 선 그리기 (UIBezierPath, CAShapeLayer) (0) | 2020.12.17 |
---|---|
[iOS - swift] String에 strikeThrough 적용 (AttributedString) (0) | 2020.11.24 |
[iOS - swift] Storyboard에 UI 구현, 코드에서 초기화하여 화면전환 하는 방법 (UIStoryboard, instantiateViewController) (0) | 2020.11.08 |
[iOS - swift] MVVM패턴을 이용하여 toggle 로직 구현 (0) | 2020.11.01 |
[iOS - swift] 19. @propertyWrapper 이용하여 UserDefault쓰기 (0) | 2020.09.19 |
Comments