CollectionView에서 CustomCell 오토레이아웃

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      IB를 이용해 CollectionView를 만들고 CustomCell을 만드는 데까지 성공은 했는데, CustomCell 내부의 오토레이아웃이예상했던 것만큼 예쁘게 나오지 않아서 IB와 코드로 같이 작성하려고 하는데요.

      이 사이트를 참조해서 https://rngo.ca/article/create-custom-uicollectionviewcell-in-swift

      커스템 셀 클래스

      ViewController 내에서 프로토콜 준수

      클래스를 작성하고  위 CustomCell을 이용하는 ViewController에서 UICollectionViewDelegate 프로토콜을 준수한 뒤,

      문제 없이 실행될 것이라고 예상했었는데 콘솔창에서 required init? 구현 부분이 호출되면 오류가 발생하네요.

      코드와 IB 혼용 문제인지 아니면 다른 구현이 미흡한지 궁금합니다.

      • 이 게시글은 광현에 의해 4 years, 6 months 전에 수정됐습니다. 이유: 이미지 크기 축소
      • 이 게시글은 광현에 의해 4 years, 6 months 전에 수정됐습니다.
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      fatalError가 무슨 역할을 하는 함수인지 검색해보면 좋을것 같네요.
      이니셜라이저의 상속도요.
      그에 대한 이해가 되면 그 이후의 이야기도 나눠볼 수 있을 것 같습니다 🙂

      • 이 답변은 야곰에 의해 4 years, 6 months 전에 수정됐습니다.
    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      init 상속 부분을 다시 상기하려 공부하는 데 시간이 조금 오래 걸렸네요. 

      [클래스의 구분]

      • 클래스에서는 지정 이니셜라이져와 편의 이니셜라이져로 역할이 구분된다. 
      • 지정 이니셜라이져(Designated Initializer)는 필요에 따라 부모클래스의 이니셜라이져를 호출할 수 있고,  이니셜라이져가 정의된 클래스의 모든 프로퍼티를 초기화 해야한다.  모든 클래스는 하나 이상의 지정 이니셜라이져를 갖는다.
      • 편의 이니셜라이져(Convenience Initializer)는 초기화를 조금 더 손쉽게 도와주는 역할을 한다. 편의 이니셜라이져는 필수 요소는 아니다. 편의 이니셜라이져는 앞에 ‘convenience’ 지정자를 init 키워드 앞에 명시해주면 된다.

      [이니셜라이져 상속 및 재정의]

      • 기본적으로 스위프트의 이니셜라이져는 부모클래스의 이니셜라이져를 상속받지 않는다. 이는 자식클래스의 새로운 인스턴스가 완전하고 정확하게 초기화 되지 않는 상황을 방지하고자 함이다.
      • 부모클래스와 동일한 지정 이니셜라이져를 자식클래스에 구현해주려면 재정의(override)를 하면 된다.  init 앞에 override를 붙이면 된다.
      • 부모클래스와 동일한 편의 이니셜라이져를 자식클래스에서 구현할 때는 override 수식어를 붙이지 않는다. 자식 클래스에서는 절대 부모의 편의 이니셜라이져를 호출할 수 없기 때문이다.

      [이니셜라이져 자동 상속]

      스위프트에서는 자식클래스는 부모 클래스의 이니셜라이져를 상속 받지 않는다.  그러나 조건에 부합한다면 부모클래스의 이니셜라이져가 자동상속된다.

      1. 규칙1 : 자식클래스에서 별도의 지정 이니셜라이져를 구현하지 않는다면 부모클래스의 지정 이니셜라이져가 자동상속되낟.
      2. 규칙2: 부모클래스의 지정 이니셜라이져를 모두 재정의하여 부모클래스와 동일한 지정 이니셜라이져를 모두 사용할 수 있는 상황이라면 부모클래스의 편의 이니셜라이져가 모두 자동 상속된다.

      [요구 이니셜라이져]

      required 수식어를 클래스의 이니셜라이져 앞에 명시해주면 이 클래스를 상속받은 자식클래스에서 반드시 해당 이니셜라이져를 구현해야한다. 다만 자식클래스에서 요구 이니셜라이져를 재정의할 때는 override 수식어 대신 required 수식어를 사용한다.

      [fatalerror]

      fatalError는 애플 공식문서에서는 너무 간단히 함수 설명만 나와 있어서 다른 개발자분들 블로그를 참고했습니다.

      fatalError는 Assertion 용도의 함수 중 하나이다. Assertion은 복구불가능한 에러를 출력하는 것?이다. 복구가능한 에러와 복구 불가능한 에러를 나눠 개발자가 대응할 수 있도록 해주는 것이라고 이해했는데 맞는지 모르겠네요.

      본래 질문에서 저는 required init에 fatalError를 발생시켜서 앱이 바로 종료했고, dequeReusableCell에서 required init이 아니라 override init이 호출된다고 생각한 게 잘못된 거 같은 데 맞나요?

       

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      네, 그렇습니다. 스토리보드 및 xib 등 인터페이스 빌더를 사용하여 인터페이스를 구성한 경우 셀의 initawakeFromNib 메서드 등 코드로 인스턴스를 생성한 것과는 다른 단계를 거치게 됩니다. 

      인터페이스 빌더를 사용하여 인터페이스를 구성한 후 빌드하여 실행하면 인터페이스를 xml에서 nib 바이너리로 인코딩 해뒀던 것을 런타임에 디코딩 해와서 인스턴스를 생성하게 되는데 이 때 사용하는 이니셜라이저가 코더를 사용한 이니셜라이저입니다.

      아래 두 개의 글을 참고해보면 좋을 것 같습니다 🙂

      • 이 답변은 야곰에 의해 4 years, 6 months 전에 수정됐습니다.
    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      이니셜라이져를 다시 공부하게 되서 좋았네요.

      링크 주신 것도 읽어볼게요.

      답변 감사합니다. 😁

      • 야곰
        키 마스터
        • 글작성 : 37
        • 답글작성 : 579

        잘 해결이 되었나요? 저도 기분이 좋네요 🙂

4 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom