web-dev-qa-db-ja.com

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

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

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
        }
    }
}

ストーリーボード上のView ControllerにUIViewを追加し、そのサブクラスをCustomViewに設定しました。

enter image description here

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

検査する属性に移動すると、次のIBInspectableプロパティを設定できます。

enter image description here

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

enter image description here

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

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

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

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

enter image description here


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

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


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

enter image description here

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

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

enter image description here

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

  • CustomViews.frameworkは、メインプロジェクトに適切に含まれています。
  • OtherView.mもコンパイルソースとして含まれているため、CustomViewに問題がある場合でも、OtherViewは機能しますが、同じエラーが生成されます。
  • Main.storyboardLaunchScreen.xibは赤で表示されます。他のプロジェクトを見た後に言えることですが、LaunchScreen.xibも表示されますが、Main.storyboardが(なぜこのファイルに触れていないのか)どうしてよいのか、何の理由もわかりません。それらのプロジェクトでは赤で、IB_DESIGNABLEIBInspectableで何もしていません。

enter image description here


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

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

他の人は、それが悪いRAMであるかもしれないと私に提案しました。それは私にとってはとてつもないことです。プロジェクトを複数回再起動し、コンピューターを複数回再起動しました。約6か月前のコンピューターに悪いRAMがあった場合、他の問題が発生し、この問題の一貫性が低下すると思われます。しかし、プロジェクト全体をゼロから再起動したり、コンピューターで完全に再起動したりしても、この正確な問題は何度も発生します。


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

88
nhgrif

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

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

「すべてのビューを更新」をクリックし、Xcodeが少し考えた後、ストーリーボードに予期したとおりにビューが表示されました(IBInspectableプロパティを適切に適用)。

enter image description here

その後、プロセス全体を再度実行して、これが解決策であることを確認しました。

新しいクラスThirdViewを作成しました。このクラスも他のクラスと同じです。ビューのクラスをThirdViewに変更し、今回は少し異なるものを取得しました。

enter image description here

警告に対して[表示]をクリックします。

enter image description here

今回は新しいもの:

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

これは、すでに存在するものよりも実際には役に立ちません。さらに、他の3つの警告が奇妙なことに6倍になりました。

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

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

ビューのクラスを「FourthView」に変更した後、designablesラベルは少しの間「更新中」と表示し、最後に「最新」と表示しました。

enter image description here

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


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

enter image description here

73
nhgrif

この問題を抱えている他の人への簡単なヒント:変数のタイプを忘れずに指定してください。

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

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

IBDesignableクラスがロードされない原因となる可能性のある詳細がいくつかあります。

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

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

XCodeの[エディター]メニューで、(nhgrifで述べたように)[すべてのビューを更新]オプションを押します。これにより、IBは、あなたが期待するものではないことを確実にするために、すべてのものをコンパイルするようになります。

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

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

IBがこれらのクラスに関連していない、またはリンクされていないカスタムビューを適切に読み込んで表示するために私が行ったコードの変更/修正のほとんどは、これらの単体テストの実行中にストーリーボードを読み込むこともありません。しかし、IBは、作業のためにコンパイルするワークスペース全体に依存していました。

20

カスタムIBDesignableビュークラスで何も間違ったことはないと確信していますが、同じ警告Ignoring user defined runtime attribute for key path ..が表示されました。

私の場合、Xcodeキャッシュに関係していることが判明しました。

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

DerivedDataをパージすると、警告は消えます。

6
samwize

私の例として、ポッド経由で CheckboxButton を使用しており、チェックボックスのグラフィックスがストーリーボードに表示されることはありませんが、以下の質問で説明されているのと同じ問題があります。

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

そして

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

私の問題を解決する方法は、次のように名前CheckboxButtonでモジュールを提供することでした:

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

5
Even Cheng

他の誰かが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">
5
Dave Thomas

「-」ボタンを使用してIDインスペクターからコンテンツを削除することで、この問題を個人的に解決しました。カスタムクラスを削除し、IBのコンテンツを変更してから新しいカスタムクラスを追加すると、IDインスペクターの設計可能な要素が削除されず、エラーが発生しました。すべてを削除して再構築するだけです。 enter image description here

これには答えがありますが、もう1つ経験があります。

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

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

最終的に、私はそれらが戻ってきたことに気付きましたただし、属性インスペクター(alt-Apple-4)のみ。そこで値を追加するとすぐに、IDインスペクターに再表示されました

1
Gordon Dove

デイブトーマスの答え 上記は、他のもの(派生データ、エディター>更新)がなかった場合に(逆の)ソリューションを提供しましたが、 XML ...する必要はありません!

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

私は同じ問題を抱えていて、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
    }
}
0
Chuy47

私はちょうどこの問題についてリンガーを調べました。私はここにリストされているすべてのものを運なしで試しました。これは永久に問題なく機能するストーリーボードであり、「ユーザー定義のランタイム属性を無視しています...」という問題で突然機能しなくなりました。

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

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

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

0
IMFletcher