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