[ios] 치명적 오류 : 클래스에 구현되지 않은 초기화 프로그램 ‘init (coder :)’사용

Swift와 함께 남은 프로젝트를 계속하기로 결정했습니다. UIViewcontroller스토리 보드보기 컨트롤러에 사용자 정의 클래스 (서브 클래스 )를 추가하고 프로젝트를로드하면 앱이 갑자기 다음 오류와 함께 충돌합니다.

치명적 오류 : 클래스에 구현되지 않은 초기화 프로그램 ‘init (coder :)’사용

이것은 코드입니다.

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에서 a를 인스턴스화하기 때문에 필요 UIStoryboard합니다.

우리는 초기화하는 방법을 보려면 UIViewControllerA로부터 UIStoryboard, 살펴 보시기 바랍니다 여기

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

때문에 오브젝티브 C는 자동으로 필요한 모든 상속 UIViewController초기화합니다.

왜 Swift가 자동으로 이니셜 라이저를 상속하지 않습니까?

스위프트 는 기본적으로 안전 때문에 이니셜 라이저를 상속하지 않습니다. 그러나 모든 속성에 값이 있거나 (선택 사항) 하위 클래스가 지정된 초기화기를 정의하지 않은 경우 수퍼 클래스에서 모든 초기화자를 상속합니다.


해결책

1. 첫 번째 방법

init?(coder aDecoder: NSCoder)대상에서 수동 구현UIViewController

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

2. 두 번째 방법

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)대상에서 제거 UIViewController하면 Dave 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 “중간 스위프트”를 참조하십시오.


답변

swift와 동일한 문제가있는 사람들을 위해 UICollectionViewCells@ 3r1d UICollectionViewCell가 View Controller가 아닌 사용자 정의 클래스에 제안한 코드를 추가하십시오 .

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


답변

Swift에서 코드가 필요한 사람들을 위해 :

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

[편집] 구 버전의 스위프트를위한 ​​것입니다. 아마도 더 이상 작동하지 않을 것입니다.


답변

나는 프로그래밍 방식의 collectionView 셀 에서이 문제를 겪었지만 op가 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로 정의하고 클래스 범위에서 바로 초기화합니다.


답변