今日の結論
ソースコード内で汎用できる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
[Next] -> "Class:"に任意クラス名、"Subclass os:"に"UIView"を指定 -> [Next] -> [Create]
- CustomView.xib
(手順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を設定する
-
PlaceHolders
のFile's Owner
のCustom Class
を
作成したViewファイル名(ここでは"CustomView")に変更する。
-
設置されている最上位View
のCustom Class
を
作成したViewファイル名(ここでは"CustomView")に変更する。
(手順4)ViewのOutletを作成する
作者はここで不毛な2時間を過ごした。
- Outletを作成したいViewを.swiftファイルに引っ張ってくる(できなかったら手順3の設定を見直す)
- Objectに**"Custom View(自分が作成したカスタムViewクラス)"**を指定する。
=>"File's Owner"を指定した場合、このカスタムViewを呼び出す処理でNSExceptionが発生してアプリが終了してしまう。
作者は、ここで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が発生するのか、説明できない。Placeholders
? File's Owner
? FirstResponder
? 少しずつ頑張ります。
・・・AutoLayoutとかも謎なので、勉強したい。