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 | 31 |
Tags
- 클린 코드
- Protocol
- map
- 리펙터링
- Clean Code
- combine
- tableView
- ribs
- MVVM
- Refactoring
- RxCocoa
- rxswift
- swiftUI
- clean architecture
- HIG
- ios
- uiscrollview
- SWIFT
- 애니메이션
- Human interface guide
- uitableview
- Observable
- Xcode
- swift documentation
- 스위프트
- UICollectionView
- 리펙토링
- collectionview
- UITextView
- 리팩토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] addChild, removeFromParent / addSubview, removeFromSuperview 본문
iOS 기본 (swift)
[iOS - swift] addChild, removeFromParent / addSubview, removeFromSuperview
jake-kim 2021. 7. 15. 23:20View를 추가하고 삭제
- addSubview(_ view: UIView): child view로 추가할때 사용
- removeFromSuperview(): child view를 삭제할때 사용
let myView = UIView()
view.addSubview(myView)
myView.removeFromSuperview()
ViewController를 추가하고 삭제
- 추가
- childViewController.didMove(toParent): UIViewController에 정의되어 있는 메서드이며, childVC가 추가될때 didMove가 불려지도록 설계가 되고 있으므로 추가되는 상황에서 호출
// ChildViewController 추가
addChild(vc)
containerView.addSubview(vc.view)
vc.view.frame = containerView.bounds
vc.didMove(toParent: self)
- 삭제
- willMove(toParent: nil)
- removeFromParent()
- view.removeFromSuperview()
func remove() {
guard self.parent != nil else {
return
}
willMove(toParent: nil)
removeFromParent()
view.removeFromSuperview()
}
* willMove, didMove 메소드
- 타이밍으로 볼 때, VC가 삭제되면 didMove는 부르지 못하므로 삭제할땐 willMove호출
- VC가 추가되면 didMove를 부를 수 있으므로 추가될때 didMove 호출
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
print("Will Move in BottomView")
}
override func didMove(toParent parent: UIViewController?) {
super.didMove(toParent: parent)
print("did Move in BottomView")
}
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하여 추후에 처리할 것을 대비하여 호출해주는 것
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)을 타이밍에 맞게 호출될 수 있게끔 하기위함
* 위 개념을 이용하여 ContainerView 사용 방법 참고
'iOS 기본 (swift)' 카테고리의 다른 글
[iOS - swift] URLSession 네트워크 통신 기본 (URLSessionConfiguration, URLSession, URLComponents, URLSessionTask) (0) | 2021.08.02 |
---|---|
[iOS - swift] Computed property vs method 구분 (0) | 2021.07.25 |
[iOS - swift] guard let self = self 사용 시 주의할 점 (0) | 2021.07.08 |
[iOS - swift] Self vs self (대문자 Self와 소문자 self) (0) | 2021.07.06 |
[iOS - swift] Identifiable 프로토콜 (0) | 2021.06.29 |
Comments