StoryboardやXibファイルからインスタンスを生成するprotocol

September 27, 2015

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をコードで書けるのでオススメです。


Profile picture

Written by morizotter who lives and works in Tokyo building useful things. You should follow them on Twitter