Fatal error: init(coder:) has not been implemented in Swfit

1. 개요


평소 개발에서 UIVIew에 계승된 하위 클래스를 만들려면 잘못하면'Fatal error: init(coder:)has not been implemented'라는 붕괴 알림이 나타납니다. 오늘 본고는 이 붕괴 해결 방안을 여기에 기록합니다.
우리가 개발하는 과정에서 UIVIew의 하위 클래스를 자주 사용자 정의하여 일부 UI 구성 요소 등을 봉인할 수 있지만, 사용할 때 우리는 다음과 같은 두 가지 방법으로 이 클래스의 실례를 만들 수 있다.
  • 순수 코드 생성..
  • xib 생성(xib에 UIVIew를 끌어다 놓고 사용자 정의 클래스로 지정)..

  • 2. 일반 코드 생성


    첫 번째 방식으로 만들면 사용자 정의 클래스에서 init(frame: CGRect) 방법을 실현하고 이 방법에서 슈퍼 방법을 호출해야 합니다. 그러나 이 init(frame: CGRect) 방법이 실현되면 Xcode가 즉시 오류를 보고하고 우리가 한 가지 방법을 더 실현해야 한다고 알려줍니다. 그것이 required init입니까?(coder: NSCoder) 메서드, 그렇지 않으면 컴파일이 통과할 수 없습니다.
    두 가지 방법이 모두 실현된 후에 컴파일이 통과되었습니다. 이때 우리는 init(frame: CGRect) 실현 방법에서 UI를 설정하는 방법을 호출할 수 있습니다.참조 예는 다음과 같습니다.
    class ReflectionView: UIView {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            setUp()
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func setUp() {
            //  UI 
        }
    }

    3. xib 만들기


    위의 순수 코드 생성 실례는 왜 required init를 강제로 요구합니까?(coder: NSCoder) 방법은?이 방법은xib를 통해 실례를 만들 때 시스템이 호출하는 방법이기 때문에 애플은 서로 다른 실례를 고려할 수 있기 때문에 UIVIew를 계승하는 하위 클래스에서 필요한 모든 초기화 방법을 요구한다.
    그러니까 저희가 required init를 더 필요로 한다고요?(coder: NSCoder) 방법을 개선하고fatalError 알림을 없애고 슈퍼 호출 방법을 추가합니다.예제 코드는 다음과 같습니다.
    class ReflectionView: UIView {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            setUp()
        }
    
        required init?(coder: NSCoder) {
            super.init(coder: coder)
            setUp()
        }
        
        func setUp() {
            //  UI 
        }
    }

    이런 글쓰기는 두 가지 방식으로 UIVIew에 계승된 하위 클래스를 만드는 데 만족한다.
    또한 사용자 정의 클래스는 순수한 코드 생성이 필요하지 않고 xib를 통해 만들 수 있다. 그러면 우리는 위의 두 가지 초기화 방법을 실현하지 않고 awakeFromNib() 방법을 실현할 수 있다.
    class ReflectionView: UIView {
    
        override func awakeFromNib() {
            super.awakeFromNib()
            setUp()
        }
        
        func setUp() {
            //  UI 
        }
    }

    4. 요약


    본고는 주로 UIVIew에 계승된 하위 클래스를 만드는 초기화 방법의 사용을 설명하고 실수로 발생할 수 있는 Fatal error: init(coder:)has not been implemented 오류 알림을 피하는 방법을 설명한다.우리가 만든 클래스를 더욱 유연하게 하기 위해서, 두 가지 초기화 방법으로 하나의 클래스를 구축하는 것을 권장합니다.
    글은 좀 간단하지만 인상을 깊게 하고 자신이 다시는 실수를 범하지 않도록 하는 동시에 필요한 사람에게 도움을 줄 수 있기를 바라며 기록할 필요가 있다.
    위의 내용이 정확하지 않으면 지나가는 친구에게 지적해 주십시오. 감사합니다!
    이 문장은https://blog.csdn.net/guoyongming925의 블로그를 전재하려면 출처를 명시해 주십시오.
     

    좋은 웹페이지 즐겨찾기