[ios] Swift의 UIViewController에서 기본 super.init ()를 호출 할 수없는 이유는 무엇입니까?

UIViewController스토리 보드에서를 사용하지 않고 일부 개체를 init전달 하는 사용자 지정 함수 를 갖고 싶습니다 NSManagedObjectID. super.init()Objective-C 에서처럼 전화하고 싶습니다. 이렇게 :

init(objectId: NSManagedObjectID) {
    super.init()
}

하지만 다음과 같은 컴파일러 오류가 발생합니다.

수퍼 클래스 UIViewController의 지정된 이니셜 라이저를 호출해야합니다.

더 이상 이렇게하지 않아도 되나요?



답변

에 대해 지정된 이니셜 라이저는 UIViewController입니다 initWithNibName:bundle:. 대신 그것을 호출해야합니다.

참조 http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/를

펜촉 nil이 없으면 nibName을 전달 하십시오 (번들도 선택 사항입니다). 그런 다음에 사용자 지정보기를 만들 수 있습니다 loadView하거나 하위 뷰를 추가하여 self.viewviewDidLoad당신이 사용하는 동일로.


답변

또 다른 좋은 해결책은 convenience다음과 같이 새 이니셜 라이저를 이니셜 라이저로 선언하는 것입니다 .

convenience init( objectId : NSManagedObjectID ) {
    self.init()

    // ... store or user your objectId
}

하위 클래스에서 지정된 이니셜 라이저를 전혀 선언하지 않으면 자동으로 상속되며 self.init()편리한 이니셜 라이저 내 에서 사용할 수 있습니다.

의 UIViewController의 경우 기본 init 메소드 호출 init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)nil두 인수 (의 UIViewController에 명령을 클릭하면 그 정보를 줄 것이다)합니다.

TL; TR : UIViewControllers 로 프로그래밍 방식으로 작업하는 것을 선호하는 경우 여기에 사용자 지정 인수가있는 새 이니셜 라이저를 추가하는 완전한 작업 예제가 있습니다.

class MyCustomViewController: UIViewController {
    var myString: String = ""

    convenience init( myString: String ) {
        self.init()

        self.myString = myString
    }
}


답변

occulus의 답변 을 개선하려면 :

init() {
     super.init(nibName: nil, bundle: nil)
}


답변

업데이트 : 링크 추가

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init

iOS 문서에 따르면 UIViewController에 지정된 이니셜 라이저는 initWithNibName: bundle:.

UIViewController를 하위 클래스로 만드는 경우 NIB를 사용하지 않더라도이 메서드의 슈퍼 구현을 호출해야합니다.

다음과 같이 할 수 있습니다.

init(objectId : NSManagedObjectID) {

    super.init(nibName: (xib's name or nil'), bundle: nil)

   // other code...
}

또는

새 이니셜 라이저를 편의 이니셜 라이저로 선언하십시오.

 convenience init( objectId : NSManagedObjectID ) {

    self.init()

     // other code...

}


답변