25
13

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.

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

Last updated at Posted at 2016-07-19

#問題
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

 

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

25
13
0

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
25
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?