ストーリーボードのUIViewController
を使用していないので、オブジェクトのinit
を渡すカスタムNSManagedObjectID
関数が必要です。 Objective-Cのようにsuper.init()
を呼び出したいだけです。このような:
init(objectId: NSManagedObjectID) {
super.init()
}
しかし、次のコンパイラエラーが発生します。
スーパークラスUIViewControllerの指定された初期化子を呼び出す必要があります
これはもうできませんか?
UIViewController
の指定初期化子はinitWithNibName:bundle:
です。代わりに呼び出す必要があります。
ペン先がない場合は、nibNameにnil
を渡します(バンドルもオプションです)。次に、loadView
でカスタムビューを作成するか、viewDidLoad
でself.view
にサブビューを追加して、以前と同じように作成します。
別の素晴らしい解決策は、次のようにconvenience
初期化子として新しい初期化子を宣言することです。
convenience init( objectId : NSManagedObjectID ) {
self.init()
// ... store or user your objectId
}
サブクラスで指定された初期化子をまったく宣言しない場合、それらは自動的に継承され、便利な初期化子内でself.init()
を使用できます。
UIViewControllerの場合、デフォルトのinitメソッドは、両方の引数に対してnil
を指定してinit(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
を呼び出します(UIViewControllerでCommandキーを押しながらクリックすると、その情報が表示されます)。
TL; TR:UIViewController
sを使用してプログラムで作業する場合は、カスタム引数を使用して新しい初期化子を追加する完全な作業例を次に示します。
class MyCustomViewController: UIViewController {
var myString: String = ""
convenience init( myString: String ) {
self.init()
self.myString = myString
}
}
occulus's答えを改善するには:
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...
}