protocol InstantiateFromNibable {
typealias Instance
static func instantiateFromNib() -> Instance
}
SlideShareの swift-style-guideから着想を得た。すごくシンプルなんだけど使い勝手は良いと思ってます。
Xibファイルなのか、Storyboardのinitialなのか、StoryboardにあるViewControllerなのか、幾つかのパターンでビューをインスタンス化したいケースがあると思いますが、この方法だとそのインターフェイスを統一できます。
久しぶりに使うビューでもとりあえず、<クラス名>.insta..
など打つとすぐに使えるかどうかがわかります。
具体的に下記のように追加します。
Xibファイルの場合
LoadingFooterViewにはこのように書く。
final class LoadingFooterView: UIView, InstantiateFromNibable {
static func instantiateFromNib() -> LoadingFooterView {
return UINib(nibName: "LoadingFooterView", bundle: nil).instantiateWithOwner(nil, options: nil).first as! LoadingFooterView
}
利用する際はこのように書く。
let footerView = LoadingFooterView.instantiateFromNib()
Storyboard上のビューの場合
SearchViewControllerにはこのように書く。
final class SearchViewController: UIViewController, InstantiateFromNibable {
static func instantiateFromNib() -> SearchViewController {
return UIStoryboard(name: "Search", bundle: nil).instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController
}
利用する際はこのように書く。
let vc = SearchViewController.instantiateFromNib()
注意すること
注意するというほどでもないのかもしれないのですが、Storyboardやxibからインスタンス化した場合、ビューのサイズはそれぞれのファイルの中で決めたサイズのままです。特に部品的なビューの場合インスタンス化したあとに、適切にAutoLayoutを設定する必要があります。 SnapKit などを使うと簡単にLayoutをコードで書けるのでオススメです。