iOS

Xcode6で「.xibファイル」+「自作UIViewクラス」で、汎用できるViewを作りたい

More than 3 years have passed since last update.


今日の結論

ソースコード内で汎用できるViewを、xib+自作UIViewクラスで作ったとき、

Outletを置く時は、Objectに「"File's Owner"でなく、自作UIViewクラス」を指定する


経緯

久しくiOS開発をやっていなかったということもあり、

xibファイル+自作UIViewクラスで作成する方法に戸惑いましたので

手順をここに記載します。


環境

MacOS
YOSEMITE 10.10.1

Xcode
6.1.1

言語
Swift


カスタムViewを作る手順


(手順1) .swiftファイルと、.xibファイルを作成する


  • CustomView.swift

create uiView.png

[Next] -> "Class:"に任意クラス名、"Subclass os:"に"UIView"を指定 -> [Next] -> [Create]


  • CustomView.xib

MyDailogView_xib.png

任意クラス名を指定して、ファイルを作成する



CustomView.png

↑こんな感じに作成できればOK


(手順2) CustomView.swiftファイル編集

例えばこんな感じ↓

import UIKit

class CustomView : UIView {

class func instance() -> CustomView {
return UINib(nibName: "CustomView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as CustomView
}

}

(参考)

http://qiita.com/ryota-ku/items/3e3485baed79842c51f2

http://blogios.stack3.net/archives/195


(手順3)xibファイルのCustomClassを設定する



  1. PlaceHoldersFile's OwnerCustom Class
    作成したViewファイル名(ここでは"CustomView")に変更する。

customclass1.png



  1. 設置されている最上位ViewCustom Class
    作成したViewファイル名(ここでは"CustomView")に変更する。

CustomClass2.png


(手順4)ViewのOutletを作成する

作者はここで不毛な2時間を過ごした。


  1. Outletを作成したいViewを.swiftファイルに引っ張ってくる(できなかったら手順3の設定を見直す)

  2. Objectに"Custom View(自分が作成したカスタムViewクラス)"を指定する。


    =>"File's Owner"を指定した場合、このカスタムViewを呼び出す処理でNSExceptionが発生してアプリが終了してしまう。

Outlet.png


↓↓↓↓↓↓できた!!↓↓↓↓↓↓↓

20141219104117.png

作者は、ここで3時間程、立ち止まりました(恥)


(手順5)ViewController等からカスタムViewを呼び出す。

各々使用したいところで、CustomView.instance()でカスタムViewを生成する。

    override func viewDidAppear(animated: Bool) {

super.viewDidAppear(animated)
self.view.addSubview(CustomView.instance())
}


最後に

iOS不明点が多い。Swiftもいろいろわからないです。

現状の知識で、なぜFile's OwnerではNSExceptionが発生するのか、説明できない。PlaceholdersFile's OwnerFirstResponder? 少しずつ頑張ります。

・・・AutoLayoutとかも謎なので、勉強したい。