Edited at

External Frameworkの@IBDesignable/@IBInspectableを有効にする方法

More than 1 year has passed since last update.


問題

carthageを使っている方だったら馴染みのある話かもしれないですが, フレームワークのヘッダファイルから @IBDesignable @IBInspectable の情報が抜け落ちてしまっているらしく, フレームワーク側で@IBDesignable @IBInspectable に対応していてもその利用者側からは使うことができません。

抜け落ちてしまうのはどうしようもないみたいですが, 対策として利用可能にする方法を調べました。


対策

フレームワーク利用者側からできる対策と, フレームワーク実装者側からできる対策がそれぞれ見つかりました。


1.該当クラスを継承して対応する(フレームワーク利用者側)

まず, @IB~ に対応しているフレームワーク内のクラスを継承したクラスを自分のプロジェクトに追加する。


@IBDesignableへの対応

そのクラスに @IBDesignable をつけるだけ。


@IBInspectableへの対応

@IBInspectable が使える変数のgetter/setterとなるcomputed propertyを追加し, @IBInspectable をつける。

参考サイトからの引用ですが, こんな感じです。

@IBDesignable

class MyCustomView: CustomView {

@IBInspectable override var bgColor: NSColor {
get {
return super.bgColor
}
set {
super.bgColor = newValue
}
}
}

参考・引用元:https://github.com/Carthage/Carthage/issues/335#issuecomment-223761898


2.実装クラスをヘッダに含めて対応する(フレームワーク開発者側)

Materialというライブラリが @IB~ に対応しており, どうやっているのか調べたところ, フレームワークのプロジェクトの

Target -> Build Phases -> Headers -> Public

に実装ファイル(*.swift)を追加していました。

これで良いのだろうかという疑問はありますが, 手元のフレームワークのプロジェクトでも @IBInspectable を利用することができました。

※追記(2016/7/21)

ちゃんとやるんであれば, 面倒ですがインターフェースだけを定義したクラスを別で作ってHeadersに追加したほうが良いかもしれないです。ちなみにprotocol@IB~をつけるのはできませんでした。

ただ, @IBDesignable の方はIB上で Build Failed となってしまい利用できず。。こちらは引き続き調べてみます。

参考元(Material):https://github.com/CosmicMind/Material

 

以上です。もっと良い方法や, 問題点ありましたら, コメントいただけると嬉しいです!