본문 바로가기

ios

9. Files owner를 이해보자

이 글은 이 블로그를 많이 참고하고 있습니다. 제가 추가한 내용도 있으니 틀린 내용은 댓글 달아주세요!

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)
    }

 

 

공부하다 알게 된것(이해가 안된다면 밑의 블로그를 보고 오면 이해가 될것)

https://sujinnaljin.medium.com/swift-%EC%BB%A4%EC%8A%A4%ED%85%80-%EB%B7%B0-xib-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-files-owner-vs-custom-class-89984ef73a59 

 

[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 안에 넣어둔다.

 

  1. custom view를 화면에 띄우기 위해
  2. file’s owner에서 지정한 클래스의 init()이 불린다. (지정한 클래스의 인스턴스가 생긴다.)
  3. loadNibName을 부른다.
  4. loadNibName을 부를때 이미 존재하는 인스턴스를 file’s owner로 지정한다.
  5. let nibs = Bundle.main.loadNibNamed(identifier, owner: self, options: nil)
  6. 위의 코드에서 owner는 self, 즉 원래 있던 인스턴스를 사용하는 것이다.
  7. loadNibName에서 생긴 인스턴스를 참조하는 nib 파일이 생긴다.

 

custom class

xib에 file’s owner와 제일 상단의 뷰에 custom class를 지정해주는 것

file’s owner에서 하듯이 init안에 loadNibName을 호출하면 무한 호출이 되어 프로그램이 죽는다.

 

  1. 다른 클래스나 xib에서 custom view class를 사용함
  2. cusom view class의 init이 불림 
  3. loadNibName을 호출함 
  4. 호출했는데 제일 상단 뷰가 custom view인 상황
  5. 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