49
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-27
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をコードで書けるのでオススメです。

49
43
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?