クラス名と同名のxibファイルでUIViewControllerを初期化したい
UIViewController のサブクラスに関する質問です。
Objective-C では [[FooViewController alloc] init] で FooViewController.xib を読み込んで ViewController を初期化できました。
Swift でも同じことがしたいのですが、FooViewController() でオブジェクトを作っても FooViewController.xib が読み込まれないようです。
最初に以下のようにやってみたのですが、super.init を呼ぶ前に self が使えないというエラーが出て無理でした。
convinience override init() {
let fullName = NSStringFromClass(self.dynamicType)
let className = split(fullName){$0 == "."}.last
super.init(nibName: className, bundle: nil)
}
以下のように init でloadNibNamedをすれば一応できるのですが、viewDidLoad を自分で呼び出すのは邪悪なので無理でした。
override init() {
super.init()
let fullName = NSStringFromClass(self.dynamicType)
let className = split(fullName){$0 == "."}.last
NSBundle.mainBundle().loadNibNamed(className, owner: self, options: nil)
viewDidLoad()
}
他には以下のように、xibを元に ViewController を作る関数も考えてみましたが、グローバル関数にするのもクラス関数にするのも微妙です。
func viewController<T: UIViewController>(type: T.Type) -> T {
let fullName = NSStringFromClass(T)
let className = split(fullName){$0 == "."}.last
let controller = T(nibName: className, bundle: nil)
return controller as T
}
// viewController(FooViewController) でオブジェクト作成
何かもっといい方法があれば教えて下さい。