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

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

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() -&gt; LoadingFooterView {
        return UINib(nibName: &quot;LoadingFooterView&quot;, bundle: nil).instantiateWithOwner(nil, options: nil).first as! LoadingFooterView
    }

利用する際はこのように書く。

let footerView = LoadingFooterView.instantiateFromNib()

Storyboard上のビューの場合

SearchViewControllerにはこのように書く。

final class SearchViewController: UIViewController, InstantiateFromNibable {
    static func instantiateFromNib() -&gt; SearchViewController {
        return UIStoryboard(name: &quot;Search&quot;, bundle: nil).instantiateViewControllerWithIdentifier(&quot;SearchViewController&quot;) as! SearchViewController
    }

利用する際はこのように書く。

let vc = SearchViewController.instantiateFromNib()

注意すること

注意するというほどでもないのかもしれないのですが、Storyboardやxibからインスタンス化した場合、ビューのサイズはそれぞれのファイルの中で決めたサイズのままです。特に部品的なビューの場合インスタンス化したあとに、適切にAutoLayoutを設定する必要があります。 SnapKit などを使うと簡単にLayoutをコードで書けるのでオススメです。

Pocket
LINEで送る

You may also like...