source

치명적 오류: 클래스에 구현되지 않은 이니셜라이저 'init(코더:)'을 사용합니다.

manycodes 2023. 4. 16. 15:23
반응형

치명적 오류: 클래스에 구현되지 않은 이니셜라이저 'init(코더:)'을 사용합니다.

저는 스위프트와 함께 남은 프로젝트를 계속하기로 했습니다.커스텀 클래스(의 서브 클래스)를 추가하는 경우UIViewcontroller스토리보드 뷰 컨트롤러에 접속하여 프로젝트를 로드하면 앱이 갑자기 크래쉬하고 다음 오류가 발생합니다.

치명적 오류: 클래스에 구현되지 않은 이니셜라이저 'init(코더:)' 사용

다음은 코드입니다.

import UIKit

class TestViewController: UIViewController {

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    override func viewDidLoad() {
        super.viewDidLoad()
              // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    /*
    // #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
}

제안해 주세요

쟁점.

이는 이니셜라이저가 없기 때문에 발생합니다.init?(coder aDecoder: NSCoder)과녁에 맞는UIViewController이 방법이 필요합니다.왜냐하면,UIViewController에서UIStoryboard라고 부릅니다.

의 초기화 방법을 확인하려면UIViewController에서UIStoryboard여기를 봐주세요.

Objective-C에서는 왜 문제가 되지 않습니까?

Objective-C는 필요한 모든 것을 자동으로 상속하기 때문입니다.UIViewController이니셜라이저

Swift가 이니셜라이저를 자동으로 상속하지 않는 이유는 무엇입니까?

기본적으로 Swift는 안전을 위해 이니셜라이저를 상속하지 않습니다.그러나 모든 속성에 값(또는 옵션)이 있고 하위 클래스가 지정된 이니셜라이저를 정의하지 않은 경우 슈퍼 클래스에서 모든 이니셜라이저를 상속합니다.


솔루션

1. 첫 번째 방법

수동 실장init?(coder aDecoder: NSCoder)과녁에 맞는UIViewController

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

2. 두 번째 방법

삭제 중init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)목표한 대로UIViewControllerDave Wood가 아래 답변에서 지적한 와 같이 필요한 이니셜라이저를 모두 슈퍼클래스로부터 상속합니다.


@3r1d 이외의 다른 옵션은 다음 init 메서드를 클래스에서 삭제하는 것입니다.

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // Custom initialization
}

이 init 메서드를 포함하면 서브클래스가 다음 명령어를 상속하지 않도록 합니다.init(coder aDecoder: NSCoder!)슈퍼클래스부터요.포함하지 않음으로써 당신의 클래스는 둘 다 상속됩니다.

주의: 자세한 내용은 약 33:50에 있는 WWDC 2014 세션 403 "Intermediate Swift"를 참조하십시오.

스위프트와 같은 문제를 안고 있는 분들을 위해UICollectionViewCells@3r1d가 제안한 코드를 커스텀에 추가합니다.UICollectionViewCellView 컨트롤러가 아닌 클래스:

init(coder aDecoder: NSCoder!)
{
    super.init(coder: aDecoder)
}

Swift에서 코드가 필요한 경우:

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

[편집] 이전 버전 Swift용입니다.더 이상 작동하지 않을 수도 있습니다.

프로그램 모음 보기 셀에서 이 문제가 발생했는데 운영에서 VC에 대해 질문하고 있는데도 답변을 찾을 때 이 질문을 발견했습니다.내게는 문제가 있었다.

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

구현되었기 때문에 상위 답이 작동하지 않았습니다.감방에 없는 건 이니셜라이저였어요

// my programmatic cell was missing this
override init(frame: CGRect) {
    super.init(frame: frame)
}

한 번 추가하면 오류가 사라집니다.

내부 메커니즘을 정상적으로 동작시키기 위한 몇 가지 방법을 추가하는 것이 아니라 자신의 속성을 @lazy로 정의하고 클래스 범위에서 바로 초기화합니다.

언급URL : https://stackoverflow.com/questions/24036393/fatal-error-use-of-unimplemented-initializer-initcoder-for-class

반응형