이 글은 이 블로그를 많이 참고하고 있습니다. 제가 추가한 내용도 있으니 틀린 내용은 댓글 달아주세요!
https://youbidan-project.tistory.com/208
[iOS/Swift] xib를 이용한 Custom UIView 만들기
UIViewController, UITableViewCell, UICollectionViewCell, UICollectionReusableView 등을 상속 받는 subclass 파일을 생성할 때 xib를 함께 만들 수 있지만 아쉽게도 UIView는 파일 생성시 함께 xib를 만들어 줄 수 없습니당
youbidan-project.tistory.com
File's owner
- 인터페이스 빌더인 .xib 파일은 컴파일하여 nib 파일을 생성한다.
- nib 파일은 UI관련 객체와 속성, 객체간 연결 정보가 포함되어 있다.
- File's Owner라는 객체는 XIB 파일이 로드 되었을 때 실제 객체의 참조를 갖는 역할을 한다.
- 즉 XIB 파일이 로드되었을 때, File's Owner가 지정한 클래스의 인스턴스에 연결되어, 그 인스턴스의 프로퍼티나 메소드를 사용할 수 있게 해줍니다.
- File's owner는 loadNibNamed: 혹은 initWithNibName:을 이용하여 nib를 로드한다.
- loadNibNamed 메소드를 사용하여 XIB 파일을 로드할 때, File's owner에 설정된 클래스의 인스턴스가 생성되고, XIB 파일 내의 객체들은 이 인스턴스에 연결됩니다.
- xib 파일의 file's owner를 custom view로 설정해주었다면 custom View의 init()에서 loadNibNamed함수를 호출해주어야한다.
- CustomViewController를 file's owner로 설정해주었다면 자동으로 override 된 initWithNibName 덕분에 따로 조치를 취하지 않아도 된다.
extension UIView {
func loadXib() {
// 1
let identifier = String(describing: type(of: self))
// 2
let nibs = Bundle.main.loadNibNamed(identifier, owner: self, options: nil)
// 3
guard let customView = nibs?.first as? UIView else { return }
// 4
customView.frame = self.bounds
// 5
self.addSubview(customView)
}
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
공부하다 알게 된것(이해가 안된다면 밑의 블로그를 보고 오면 이해가 될것)
[Swift] 커스텀 뷰 xib 연결하기 : File’s Owner vs Custom Class
또 뭐가 다른건디요~~!🤔🤔
sujinnaljin.medium.com
file’s owner, custom class 방법 두가지가 있다.
file’s owner
file’s owner에 class를 지정해준다. 이 지정은 단순히 file’s owner는 이 클래스다 라고 선언만 해주는 것이므로
이 설정만으로는 custom class 를 호출했을 때 xib를 화면에 띄울수 없다.
file’s owner는 loadNibName이나 initNibNamed()를 호출해 주어야 화면에 xib를 띄울수 있다.
이 설정은 file’s owner에 지정한 클래스가 초기화와 동시에 이루어져야하기 떄문에 init 안에 넣어둔다.
- custom view를 화면에 띄우기 위해
- file’s owner에서 지정한 클래스의 init()이 불린다. (지정한 클래스의 인스턴스가 생긴다.)
- loadNibName을 부른다.
- loadNibName을 부를때 이미 존재하는 인스턴스를 file’s owner로 지정한다.
- let nibs = Bundle.main.loadNibNamed(identifier, owner: self, options: nil)
- 위의 코드에서 owner는 self, 즉 원래 있던 인스턴스를 사용하는 것이다.
- loadNibName에서 생긴 인스턴스를 참조하는 nib 파일이 생긴다.
custom class
xib에 file’s owner와 제일 상단의 뷰에 custom class를 지정해주는 것
file’s owner에서 하듯이 init안에 loadNibName을 호출하면 무한 호출이 되어 프로그램이 죽는다.
- 다른 클래스나 xib에서 custom view class를 사용함
- cusom view class의 init이 불림
- loadNibName을 호출함
- 호출했는데 제일 상단 뷰가 custom view인 상황
- 2번 부터 무한 반복 후 앱 죽음
제일 상단의 뷰를 custom class로 지정해준다면 custom view class 안에서 loadNibName을 할 것이 아니라 customView class를 사용하는 곳에서 loadNibName을 해야한다.
'ios' 카테고리의 다른 글
11. 동기화 공부하기 (0) | 2023.12.13 |
---|---|
10. ios의 frame과 bounds (0) | 2023.12.11 |
8. Xcode button의 Sent Events에 대해서 알아보자 (0) | 2023.12.04 |
7. iOS UIApplication 공부하기 (0) | 2023.11.21 |
6. ios videoLab에 대한 문서 공부 (0) | 2023.11.14 |