UIViewController
Swift의 서브 클래스에 커스텀 이니셜 라이저를 어떻게 추가 합니까?
UIViewController
다음과 같은 하위 클래스를 만들었습니다 .
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
실행할 때 치명적인 오류가 발생합니다.
치명적인 오류 : ‘MyApp.MyViewController’클래스에 구현되지 않은 초기화 프로그램 ‘init (nibName : bundle :)’사용
사용자 지정 이니셜 라이저를 추가 할 때 재정의해야하는 부분도 읽었으므로 init(coder aDecoder:NSCoder)
재정의하고 init
어떻게되는지 살펴 보겠습니다 .
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
이것을 추가하면 Xcode는 self.leftVC is not initialized at super.init call
. 그래서 나는 그것이 해결책이 될 수 없다고 생각합니다. 그렇다면 ViewController
Swift 의 하위 클래스에 사용자 지정 이니셜 라이저를 올바르게 추가 할 수있는 방법이 궁금합니다 (Objective-C에서는 문제가되지 않는 것 같습니다)?
답변
해결했습니다! 이 경우에는 nibName이있는 init 인 지정된 이니셜 라이저를 호출해야합니다.
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC
self.rightVC = rightVC
self.gap = gap
super.init(nibName: nil, bundle: nil)
setupScrollView()
setupViewControllers()
}
답변
보다 일반적인 UIViewController의 경우 Swift 2.0에서 사용할 수 있습니다.
init() {
super.init(nibName: nil, bundle: nil)
}
답변
이 문제를 완전히 해결할 수 있었는지 확실하지 않지만 클래스 인터페이스의 모양과 실제로 코더 기능이 필요한지 여부에 따라 아래를 사용할 수도 있습니다.
convenience required init(coder aDecoder: NSCoder)
{
//set some defaults for leftVC, rightVC, and gap
self.init(leftVC, rightVC, gap)
}
init:leftVC:rightVC:gap
은 (는) 지정된 이니셜 라이저 이므로 지정된 이니셜 init:coder
라이저를 호출하는 편리한 이니셜 라이저로 만들어 구현 요구 사항을 충족 할 수 있습니다 .
이것은 더 나을 수 있습니다
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
일부 속성을 초기화해야하는 경우 다시 작성해야하기 때문입니다.
답변
스위프트 5
사용자 정의를 작성하려는 경우에 이니셜 UIViewController
로 초기화된다storyBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Optional
속성 에 대해서만 사용자 지정 이니셜 라이저를 작성할 수 있습니다 .
class MyFooClass: UIViewController {
var foo: Foo?
init(with foo: Foo) {
self.foo = foo
super.init(nibName: nil, bundle: nil)
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.foo = nil
}
}