95

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

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 のキー値コーディングに準拠していません。

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

ここに画像の説明を入力


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

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


コメントに基づいて、.mファイルが含まれていない可能性があり、それが問題の原因である可能性があることが示唆されています。このシナリオが当てはまるとしたら、きっと私は道を踏み外しただろうと思いましたが、とにかくチェックしました.

ここに画像の説明を入力

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

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

ここに画像の説明を入力

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

  • CustomViews.frameworkメインプロジェクトに適切に含まれています。
  • OtherView.mもコンパイルソースとして含まれているので、 に問題があっても動作するはずですがCustomViewOtherView同じエラーが発生します。
  • Main.storyboardLaunchScreen.xib赤く表示されています。理由はわかりませんし、なぜそうLaunchScreen.xibすべきなのかについての少しの手がかりもありません (私はこのファイルに触れていません) Main.storyboardIB_DESIGNABLEまたはそこで何もしていませんIBInspectable

ここに画像の説明を入力


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

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

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


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

4

11 に答える 11

78

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

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

[Refresh All Views] をクリックすると、Xcode が少し考えた後、突然、ストーリーボードにビューが期待どおりに表示されました (IBInspectableプロパティが適切に適用されました)。

ここに画像の説明を入力

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

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

ここに画像の説明を入力

[表示] をクリックすると警告が表示されます。

ここに画像の説明を入力

今回は新作:

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

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

いずれにせよ、エディターのドロップダウン メニューから [すべてのビューを更新] をもう一度クリックすると、すべてのエラーが消え、再びビューが適切に表示されます。

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

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

ここに画像の説明を入力

というわけで、自宅のパソコンを調べてみました。いつも動いていたパソコンで「ビューを自動更新」をONに。そうでないコンピューターでオフにされました。このメニューオプションに触れたことを覚えていません。Xcode 6 より前に存在していたかどうかはわかりませんが、このオプションが違いを生んでいました。


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

ここに画像の説明を入力

于 2014-11-03T18:36:17.320 に答える
23

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

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

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true
于 2016-09-27T21:07:23.090 に答える
6

Ignoring user defined runtime attribute for key path ..カスタム IBDesignable ビュー クラスで何も悪いことをしていないと確信しているにもかかわらず、同じ警告が表示されました。

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

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

パージDerivedDataすると、警告はなくなりました。

于 2015-11-18T13:10:02.620 に答える
4

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

于 2015-10-16T08:49:02.857 に答える
1

これが答えであることは知っていますが、ここでもう1つの経験があります。

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

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

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

于 2016-03-12T14:29:39.513 に答える
1

上記の Dave Thomas の回答は、他の人 (派生データ、エディター > 更新) ではなく、(逆の) 解決策を提供してくれましたが、XML を編集する場所がわからない場合に備えて、明確にするために...あなたはしません 'する必要はありません!

  1. ストーリーボード ファイルで、面倒なビューを選択します
  2. 右側のサイドバーで、Identity Inspector タブ (左から 3 番目のオプション) を選択します。
  3. 既に設定されているはずのカスタム クラスとModule. 私にとってこれは空で、OP と同じエラーが発生していました。Moduleプロジェクト名と BAMに設定しました。再構築後に機能し始めました。
于 2016-04-23T15:49:24.850 に答える
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
    }
}
于 2016-05-11T13:55:32.447 に答える