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
합니다.
우리는 초기화하는 방법을 보려면 UIViewController
A로부터 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로 정의하고 클래스 범위에서 바로 초기화합니다.