IB_DESIGNABLE、IBInspectable —インターフェイスビルダーは更新されません


91

次のコードセットがあります。

CustomView.h

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface CustomView : UIView

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

@end

CustomView.m

#import "CustomView.h"

@implementation CustomView

- (void)setBorderColor:(UIColor *)borderColor {
    _borderColor = borderColor;
    self.layer.borderColor = borderColor.CGColor;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    _borderWidth = borderWidth;
    self.layer.borderWidth = borderWidth;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
}

@end

(Swift参照の場合、この問題はSwiftコードでも発生していました)

CustomView.swift

@IBDesignable
class CustomView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    @IBInspectable var borderColor : UIColor = UIColor.clearColor() {
        didSet {
            self.layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius : CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }
}

UIViewストーリーボードのビューコントローラにを追加し、そのサブクラスをに設定しましたCustomView

ここに画像の説明を入力してください

これにより、「Designables」行が追加されます。「更新中」のままで、ツールチップに「ターゲットのビルドを待機しています」と表示されます。このステータスから変化することはありません。

属性インスペクションに移動すると、次のIBInspectableプロパティを設定できます。

ここに画像の説明を入力してください

また、設定すると、「ユーザー定義ランタイム属性」にも表示されます。

ここに画像の説明を入力してください

ただし、「Designables」ステータスは、同じツールチップで「更新中」を超えて移動することはありません(Cmd + Bビルドを何度か試しましたが、何も変わりません)。

さらに、IBInspectableプロパティを設定すると、それぞれに対して警告が表示されます。

IBDesignables-「UIView」のインスタンスのキーパス「borderColor」のユーザー定義ランタイム属性を無視しています...このクラスは、キーborderColorのキー値コーディングに準拠していません。

生成された警告のスクリーンショット:

ここに画像の説明を入力してください


私はKey-Valueコーディングに準拠した問題に精通しており、一般にそれらの解決方法を知っています...しかし、この問題をここで解決する方法がわかりません。ビューのIDインスペクターによると、ビューは "CustomView"です(これらのプロパティを持たない通常の "UIView"ではありません)。また、ビューが「CustomView」でない場合、これらのデザイン可能なプロパティは属性インスペクターに表示されませんでしたよね?しかし、Interface Builderがこれらの属性をビューに適用しようとすると、ビューのクラスは「UIView」であると考えて属性を適用できなくなります。

何か助けは?重要な詳細を省略した場合はお知らせください。ただし、その価値のために、このチュートリアルを正確に実行しました(ObjCとSwiftを除く)。このチュートリアルを別のマシンで正確に実行し、それが魅力的に機能したことも注目に値します(この投稿を昨夜作成するつもりでしたが、当時使用していたコンピューターにはこの問題はありませんでした)。


コメントに基づいて、おそらく.mファイルが含まれておらず、それが問題を引き起こしている可能性があることが示唆されています。確かに、このシナリオに当てはまるのであれば、自分の道を外れると思いましたが、とにかくチェックしました。

ここに画像の説明を入力してください

これを最初に試みたとき、IB_DESIGNABLEクラスは別のUIKitフレームワークの一部である必要があることを理解していました。この最初のスクリーンショットから、1つのクラスを持つ「CustomViews」フレームワークを設定したことがわかりますCustomView。また、別のフレームワークにないことを除いて、OtherViewと同じを作成したこともわかりますCustomView。ただし、両方のクラスのストーリーボードには同じ問題が残っています。

ここにCustomView.mCustomViewsフレームワークでビルドするために含まれていることを示すスクリーンショットがあります。

ここに画像の説明を入力してください

一方、次のスクリーンショットはいくつかのことを示しています。

  • CustomViews.framework メインプロジェクトに適切に含まれています。
  • OtherView.mまた、その何かが間違っているとされていても、コンパイルソースとして含まれているCustomViewOtherViewしかし、それは同じエラーを生成し、動作するはずです。
  • Main.storyboardそしてLaunchScreen.xib赤として表示されます。なぜなのかわからず、なぜLaunchScreen.xibすべきなのかについての手がかりもありません(このファイルには触れていません)。ただし、他のプロジェクトを調べた後、これらのプロジェクトについてMain.storyboardも赤で表示されます。で何もしていないIB_DESIGNABLEか、IBInspectableそこに。

ここに画像の説明を入力してください


私はこれを数回試し、再試行しました。自宅のコンピュータで毎回機能します。この質問で説明されている問題を自宅で再現することはできません。仕事では、それは決して機能しません。この質問で説明されている問題は毎回発生します。

どちらのコンピューターも今年新しく購入したMac Miniです(新しいモデルではなく、2012年後半のモデル)。両方のコンピューターでOS X Yosemite 10.10が実行されています。両方のコンピューターでXcodeバージョン6.1が実行されています。自宅では、ビルドは(6A1052d)です。今朝、両方のコンピューターで同じビルドのXcodeが実行されていることを確認できます。

他の人はそれが悪いRAMかもしれないと私に提案しました。それは私にはなじみにくいようです。プロジェクトを複数回再起動し、コンピュータを複数回再起動しました。約6か月前のコンピューターに不良RAMがあった場合、他の問題が発生していること、およびこの問題の一貫性が低下しているように思えます。しかし、コンピュータ全体でプロジェクト全体を最初から再起動して完全に再起動しても、この正確な問題は解決しません。


このプロジェクトを実際にコンパイルして実行するとIBInspectable、ストーリーボードに表示されると期待されるとおり、プロパティを含むカスタムビューが実際に表示されることに注意してください。これらはユーザー定義のランタイム属性として作成されるため、IB_DESIGNABLEand IBInspectableディレクティブがなくてもこれが当てはまると思います。


まあ、それは単なるアイデアでした。ターゲットからCustomView.mを削除し、アプリを実行すると同様の警告が表示されました。
マーティンR

一見同じように見えるマシン(どういうわけか違います)と比較すると、それは本物のグレムリンのようです。devforumsに投稿してみましたか?追加情報なしであなたは盲目的に飛んでいるようで、あなたのプロセスは合理的で合理的であるようです。Xcodeは誤解を招くエラーメッセージで溢れているため、「ビルド」警告はそれほど意味がないかもしれません。しかし、キックについては、エディター->「選択したビューのデバッグ」を試しましたよね?(おそらく動作しませんが、健全性チェックの価値があります)。また、(ロギング)コンソールアプリに何かが表示されますか?
Chris Conover、2014年

同じ問題があります。IB_DESIGNABLEを含む単一のxibファイルを持つ鉱山。ただし、設定を確認したところ、既に自動更新がオンになっていて、手動で更新したり、最初に派生データを消去したりしています。これまでのところ、何も機能していません。奇妙なことに、このコントロールが正常に機能していて、停止しました。そして、その間にコードを変更したとは思わない。クレイジー。
drekka 2015年

上記のように警告を表示していました。これで、設計可能な元のIBからコピーされたコードを使用して2番目のクラスを作成しました。このクラスは完全に機能し、元の非稼働クラスに切り替えたところ、正常に機能するようになりました。これから、元のib設計可能要素が別のib設計可能要素と交換されるまで消去されない(派生データにはない)キャッシュがどこかにあると結論付けました。UIViewに変更しても、このキャッシュはクリアされないようです。別のibのみが設計可能です。図に行く:-)
drekka

回答:


75

選択したビューをデバッグするというchriscoの提案(既に実行済みですが、適切な方法で再試行しました)に基づいて、エディターメニューの下部に他のいくつかのオプションがあることに気付きました。

  • ビューを自動的に更新
  • すべてのビューを更新

[すべてのビューを更新]をクリックし、Xcodeで少し考えた後、突然ストーリーボードにビューが期待どおりに表示されました(適切に IBInspectableプロパティを)。

ここに画像の説明を入力してください

次に、プロセス全体をもう一度実行して、これが解決策であることを確認しました。

新しいクラスを作成しましたThirdView。このクラスも他のクラスと同じです。私はビューのクラスをに変更し、ThirdView今度は少し違うものを得ました:

ここに画像の説明を入力してください

「表示」をクリックすると、警告が表示されます。

ここに画像の説明を入力してください

今回は新しいもの:

クラスThirdViewが存在しないため、カスタムクラスを持つオブジェクトにクラスUIViewを使用します。

これは、すでに存在しているものよりも本当に役立つものではありません。さらに、他の3つの警告が奇妙に6つに倍増しました。

とにかく、[エディター]ドロップダウンメニューから[すべてのビューを更新]をもう一度クリックすると、すべてのエラーがなくなり、ビューが正しく表示されます。

それでも、これまでのところ、私がやったことはすべて、家でいじったことのないものでした。家では、それはうまくいきました。そこで、「ビューの自動更新」をオンにして、テストする「FourthView」を作成しました。これも、最初の3つと同じです。

ビューのクラスを「FourthView」に変更した後、designablesラベルは「Updating」と一瞬表示し、最後に「Up to date」と表示しました。

ここに画像の説明を入力してください

それで、私は自宅でコンピューターをチェックしました。「自動的にビューを更新する」は、常に動作していたコンピューターでオンになっています。そうではなかったコンピュータでオフになりました。このメニューオプションに触れたことを覚えていません。Xcode 6より前に存在していたかどうかさえわかりませんが、このオプションが違いを生んでいます。


TL; DR、質問で説明されているのと同じ問題が発生している場合は、「ビューの自動更新」がオンになっていることを確認してください(またはIBで更新が必要な場合は手動で「すべてのビューを更新」してください)。

ここに画像の説明を入力してください


2
古いMacBookを本当に遅くするバックグラウンドでレンダリングし続けるので、私は実際にそれをオフにする方法を探していました。ありがとう!
デパルタメントB

これは一時的に解決する場合がありますが、@ Martin-Gilles Lavoieからの回答をチェックしてください
Ashley Mills

22

IBDesignableクラスが読み込まれない原因となる詳細がいくつかあります。

カスタムビューを表示する必要がある問題のあるストーリーボード/ xibを選択します。

ナビゲーター領域で、XCodeワークスペース/プロジェクトのレポートナビゲーターに移動します。

XCodeのエディターメニューで、(nhgrifで言及されているように)[すべてのビューを更新]オプションをクリックします。これにより、IBはあなたが予想していないものすべてのコンパイルを開始します。

レポートナビゲーターで、[グループ別]をクリックしてコンテンツをフィルターし、[インターフェイスビルダー]セクションを確認します。カスタムIBDesignableビューフレームワークをロードするために、大量のものがコンパイルされることがわかります。これらのターゲットのいずれかがコンパイルされない場合(おそらく非推奨)ユニットテストターゲット(これらがこれらのビューまたはストーリーボードをロードするコードにまったく関係がない場合でも)の場合、IBはdllのロードに失敗します。

私の場合、IBは、私たちが取り組んでいる最近のリファクタリング変更以降に更新されていない単体テストを含む4つのターゲットを含む、8つのターゲットをコンパイルしようとしました。

これらのクラスに関連付けられていない、またはリンクされていないカスタムビューをIBが適切にロードして表示するために行ったコード変更/修正のほとんどは、これらのユニットテストの実行中にストーリーボードをロードしません。それでも、IBは、動作するようにコンパイルするワークスペース全体に依存していました。


ねえ、どうやってIBがこれらのクラスに関連付けられていない、またはリンクされていないビューをロードして表示しようとしないようにするのですか?
HannahCarney

ヘッダーの依存関係に関係していると思います。設計可能なクラスが他のクラスに接触しているかどうかに関係なく、ヘッダーが表示されるとすぐに、関連する実装が構築されます。Appleは、XC7GMのソース依存関係グラフコードをいじっています。これは、グラフを構築しているときにXCodeがクラッシュしてプロジェクトで完全に失敗します。次の7.1betasは問題を示しません。私たちの自動ビルドシステムは今のところまだ6.4に依存しているため、XC6.4でこれをさらに解決する方法は調査していません。7.1GMに直接ジャンプします。
Martin-Gilles Lavoie、2015年

複数のターゲット/プロジェクトがある場合、これは完全に正しい答えであり、実際に問題を解決します。すべてのターゲットはクリーンにビルドする必要があります。レポートナビゲーターに「Interface Builder」セクションがあることさえ知りませんでした!私が見た他のすべての答えは基本的に一時的にそれを修正するかもしれない多くの手を振っていますが、これが決定的な解決策です。よくやった。
Ashley Mills

3
したがって、これによると、IB_DESIGNABLE属性は完全なたわごとであり、時間の浪費であると結論付けることができます。使用しないでください。
m8labs 2017

IB_DESIGNABLEは、上記の問題と解決策とは関係ありません。これは、IBが使用可能なものを見つけるためのNO-OPフラグにすぎません。あなただけのクリーンハウスを維持する必要があります。
Martin-Gilles Lavoie 2017

22

この問題を抱えている他の人のための簡単なヒント:変数の型を指定することを忘れないでください。

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true

6

私は同じ警告を受けました Ignoring user defined runtime attribute for key path ..カスタムIBDesignableビュークラスで問題が発生していないことは確かです表示されました。

結局のところ、私の場合、それはXcodeキャッシュに関係しています。

rm -rf ~/Library/Developer/Xcode/DerivedData/*

パージDerivedDataと警告は消えました。


1
同じ結果を達成するためのXcodeでショートカット:⌘⇧K
Mojo66

@ Mojo66 Clean BuildはDerivedDataフォルダーのパージとは異なると思います。もちろん、クリーンビルドは、特定のXcodeキャッシング問題を解決するのに十分な場合もあります。
samwize '12

@ Mojo66おそらく⌘⌥⇧K(cmd + alt + shift + K)
tzaloga

5

私と同じ理由で、他の誰かがエラーIB Designablesクラスが存在しないというエラーに遭遇した場合。トップアンサーは私の問題ではありませんでした...しかし、これは少し関連した問題です...

ストーリーボードのソースコードには、customModuleというプロパティが隠されています。

たとえば、誤ってメインターゲットに追加した別のフレームワーク内にForwardArrowというクラスがありました。

そのため、一部のビューのXMLは、customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"となりました。

ビルドのメインターゲットからそれらを削除したとき、ストーリーボードはMainTargetNameWasHereをそれが配置されているフレームワークであるCustomViewsに更新しませんでした。

だからTLDR; IBDesignableが別のフレームワークにある場合は、ストーリーボードのcustomModule xml属性が正しい値に設定されていることを確認してください。そして、それがまったくない場合は、追加します。

私のソースからの例:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">

1
なんてこった、これは私に1日間ナッツを運転してきた。なんという厄介なバグでしょう。
GoldenJoe

5

私の例として、ポッドを介してCheckboxButtonを使用しており、チェックボックスのグラフィックがストーリーボードに表示されませんが、こちらの質問で説明されている同じ問題が発生しました:

警告:IB Designables:クラスCheckboxButtonが存在しないため、カスタムクラスを持つオブジェクトにクラスUIViewを使用しています

そして

警告:IB Designables:「UIView」のインスタンスのキーパス「checkColor」のユーザー定義ランタイム属性を無視します。値を設定しようとしたときに例外が発生しました:[setValue:forUndefinedKey:]:このクラスは、キーcheckColorのキー値コーディングに準拠していません。

私の問題を解決する方法は、以下のようにモジュールにCheckboxButtonという名前を付けることでした:

注:CheckboxButtonは、使用しているモジュールの名前に置き換えてください。


4

私は個人的に、「-」ボタンを使用してIDインスペクターからコンテンツを削除することにより、この問題を解決しました。カスタムクラスを削除し、IBのコンテンツを変更してから新しいカスタムクラスを追加すると、IDインスペクターのデザイン可能な要素が削除されず、エラーが発生しました。すべてを削除して再構築するだけです。ここに画像の説明を入力してください


私はあなたが言ったことを正確に行い、それが私の問題を解決しました。ここで公開された以前のソリューションはすべて成功しませんでした。どうもありがとう。; o)
XLE_22

@ XLE_22時々それはそれを解決するのは誰も見ていない答えです、え?:)
HannahCarney

いくつかのxibのIBInspectableプロパティの名前を変更するという問題がありました。それを行った後、XCodeが名前が変更されたプロパティを見つけられなかったことを通知する大量の警告がありました。IDインスペクターからプロパティを削除すると、問題が解決しました。
WBuck

1

私はこれが答えられることを知っていますが、ここにもう一つの経験があります。

この問題とは無関係の問題がいくつかありましたが、その過程で、クラスの変数から@IBInspectableを削除し、IDインスペクター(alt-apple-3)から属性を削除しました。

コンポーネントの(コード)問題を修正した後、何回もすべてを更新しましたが、IDインスペクターには属性がありません。

最終的に、属性インスペクター(alt-apple-4)だけに戻ってきたことがわかりました。そこで値を追加するとすぐに、IDインスペクターに再び表示されました


1

上記のDave Thomasの答えは、他のものではない(派生データ、エディター>更新)ときに(リバース)解決策を私に与えましたが、人々がXMLを編集する場所がわからない場合に備えて明確にするために...あなたはしませんする必要があります!

  1. ストーリーボードファイルで、問題のあるビューを選択します
  2. 右側のサイドバーで[Identity Inspector]タブを選択します(左から3番目のオプション)。
  3. あなたはすでに設定されなければならないカスタムクラスを、持っている、とよModule。私にとってこれは空で、OPと同じエラーが発生しました。私はModule自分のプロジェクト名とBAM に設定しました-再構築後に機能し始めました!

0

私はこの問題についてリンガーを調べました。ここに記載されているものや他の場所にあるものすべてを、運がなくても試しました。これは永久に問題なく機能するストーリーボードであり、「ユーザー定義のランタイム属性を無視しています...」の問題の処理が突然停止しました。

何らかの理由で、このコードを私のIBDesignableの1つから削除すると修正されます。

-(void)viewDidLoad {
    self.clipsToBounds = YES;
}

これを削除すると、他のIBDesignableオブジェクトでも、すべての警告が消えます。なぜこの1つのステップでそれが修正されたのかはわかりませんが、おそらく他の人にも役立つでしょう。


3
ここで夕食の呼びかけを逃した
RolandasR

0

同じ問題があり、cornerRadiusとBorderWidthをStringに変更してからCGFloatにキャストする必要がありました。これは、値を変更してインターフェイスビルダーで変更を確認できる唯一のソリューションでした。

@IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor!.CGColor
    }
}

@IBInspectable var borderWidth: String? {
    didSet {
        layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0)
    }
}

@IBInspectable var cornerRadius: String? {
    didSet {
        layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0)
        layer.masksToBounds = layer.cornerRadius > 0
    }
}

IBInspectableは特定のタイプしか実行できないので、Float代わりにを使用CGFloatしてキャストする必要があったと思います
Fonix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.