source

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

lovecheck 2023. 8. 5. 10:38
반응형

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

사용하지 않습니다.UIViewController스토리보드에서 그리고 나는 커스텀을 원합니다.init내가 통과하는 기능NSManagedObjectID어떤 목적의그냥 전화하고 싶어요super.init()제가 오브젝티브-C에서 했던 것처럼.다음과 같이:

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

그러나 다음과 같은 컴파일러 오류가 발생합니다.

Superclass UIViewController의 지정 이니셜라이저를 호출해야 합니다.

더 이상은 안 해도 되나요?

다음에 대한 지정된 이니셜라이저UIViewController이라initWithNibName:bundle:당신은 그것을 대신 불러야 합니다.

http://www.bignerdranch.com/blog/real-iphone-crap-2-initwithnibnamebundle-is-the-designated-initializer-of-uiviewcontroller/ 을 참조하십시오.

닙이 없으면 전달합니다.nilnibName(번들도 선택 사항임)에 대해 설명합니다.그런 다음 사용자 정의 보기를 구성할 수 있습니다.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: 프로그래밍 방식으로 작업하려는 경우UIViewController다음은 사용자 지정 인수를 사용하여 새 이니셜라이저를 추가하는 완전한 작업 예제입니다.

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

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

        self.myString = myString
    }
}

오큘러스의 답변을 개선하기 위해:

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

업데이트: 링크 추가

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

iOS용 문서에 따르면, UIView 컨트롤러의 지정 이니셜라이저는 다음과 같습니다.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...

}

언급URL : https://stackoverflow.com/questions/24095037/why-cant-i-call-the-default-super-init-on-uiviewcontroller-in-swift

반응형