StoryboardやXibファイルからインスタンスを生成するprotocolStoryboardや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をコードで書けるのでオススメです。

カテゴリー: Code

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください