Swift의 UIViewController에서 기본 super.init ()를 호출 할 수없는 이유는 무엇입니까?
UIViewController
스토리 보드에서를 사용하지 않고 일부 개체를 init
전달 하는 사용자 지정 함수 를 갖고 싶습니다 NSManagedObjectID
. super.init()
Objective-C 에서처럼 전화하고 싶습니다. 이렇게 :
init(objectId: NSManagedObjectID) {
super.init()
}
하지만 다음과 같은 컴파일러 오류가 발생합니다.
수퍼 클래스 UIViewController의 지정된 이니셜 라이저를 호출해야합니다.
더 이상 이렇게하지 않아도 되나요?
에 대해 지정된 이니셜 라이저는 UIViewController
입니다 initWithNibName:bundle:
. 대신 그것을 호출해야합니다.
펜촉이없는 경우 nil
nibName을 전달 하십시오 (번들도 선택 사항입니다). 그런 다음에 사용자 지정보기를 만들 수 있습니다 loadView
하거나 하위 뷰를 추가하여 self.view
에 viewDidLoad
당신이 사용하는 동일로.
또 다른 좋은 해결책은 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
s 로 프로그래밍 방식으로 작업하는 것을 선호하는 경우 여기에 사용자 지정 인수로 새 이니셜 라이저를 추가하는 완전한 작업 예제가 있습니다.
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...
}
'Programing' 카테고리의 다른 글
Git에서 오래된 원격 분기 제거 (0) | 2020.11.04 |
---|---|
bash 스크립트를 실행할 때 줄 번호를 표시하는 방법 (0) | 2020.11.04 |
중복 된 Java 런타임 옵션 : 선호하는 순서는 무엇입니까? (0) | 2020.11.04 |
웹 사이트 용 Apple Touch 아이콘 (0) | 2020.11.04 |
jQuery로 JSON 트리를 검색하는 방법 (0) | 2020.11.04 |