1. ホーム
  2. ios

[解決済み] IB_DESIGNABLE, IBInspectable -- インターフェースビルダーが更新されない

2023-02-08 05:45:54

質問

次のようなコードがあります。

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" 行を追加します。 これは "Updating" で止まっており、ツールチップには "Waiting for Target to Build" と表示されます。 この状態から変更されることはありません。

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

そして、一度設定されると、それらは "ユーザー定義ランタイム属性" にも表示されます。

しかし、"Designables" の状態が "Updating" を超えて動くことはなく、ツールチップも同じままです (Cmd+B building を何度か試しましたが何も変わりません)。

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

IBDesignables - UIView のインスタンスで、キーパス "borderColor" のユーザー定義の実行時属性を無視します。

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


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

何か良い方法はないでしょうか。 もし私が重要な詳細を省いていたら教えてください。 私はこのチュートリアルに正確に従いました に従いました (ObjC vs Swift 以外は)。 また、別のマシンでこのチュートリアルに正確に従ったところ、魅力的に動作したことも注目に値します (この投稿を昨夜行うつもりでしたが、そのとき使用していたコンピュータにはこの問題がありませんでした)。


コメントに基づいて、おそらくは .m ファイルが含まれておらず、それが問題を引き起こしている可能性があることが示唆されました。 きっと、このシナリオのためにわざわざ作ったのだろうと思いましたが、とりあえず確認してみました。

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

ここでは、スクリーンショットで CustomView.m が含まれていて、ビルドする際に CustomViews フレームワークでビルドされるように含まれています。

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

  • CustomViews.framework が適切にメインプロジェクトに含まれるようにします。
  • OtherView.m もコンパイルソースとしてインクルードされます。 CustomView , OtherView は動作するはずですが、同じエラーが発生します。
  • Main.storyboardLaunchScreen.xib が赤で表示されています。 なぜなのか全く分からないし、なぜ LaunchScreen.xib がなぜそうなるのか(私はこのファイルを触っていません)、全く分かりませんが、他のプロジェクトを見た後に言うことができます。 Main.storyboard も赤で表示されます。 IB_DESIGNABLE または IBInspectable があります。


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

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

他の人は、悪い RAM かもしれないと私に提案しました。 それは私には遠いことのように思えます。 私はプロジェクトを何度も再起動し、コンピューターも何度も再起動しました。 約 6 か月前のコンピューターに不良 RAM がある場合、他の問題が発生し、この問題はあまり一貫していないように思われます。 しかし、プロジェクト全体を何度もゼロから再起動し、コンピュータを完全に再起動したにもかかわらず、この問題は解決されません。


注目すべきは、このプロジェクトを実際にコンパイルして実行した場合、カスタム ビューで IBInspectable プロパティを持つカスタム ビューは、私がストーリーボードで表示されることを期待したとおりに実際に表示されます。 私は、これは IB_DESIGNABLEIBInspectable ディレクティブがありますが、これらは User Defined Runtime Attributes として作成されるためです。

どのように解決するのですか?

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

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

私は "Refresh All Views" をクリックし、Xcode が少し考えた後、突然ストーリーボードが期待通りに私のビューを表示しました(適切に私の IBInspectable プロパティを適切に適用しています)。

その後、これが解決策であることを確認するために、もう一度すべてのプロセスをやり直しました。

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

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

今回は新作です。

<ブロッククオート

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

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

とにかく、もう一度エディタのドロップダウン メニューから "Refresh All Views" をクリックすると、すべてのエラーがなくなり、再び、ビューが適切に表示されるようになりました。

それでも、ここまでにしたことはすべて、家では決していじらなかったことです。 家では、ただ動くだけでした。 そこで、私は "Automatically Refresh Views" をオンにして、テスト用の "FourthView" を作成し、もう一度、最初の 3 つと同じものを作成しました。

ビューのクラスを "FourthView" に変更した後、designables のラベルに "Updating" としばらく表示され、最後に "Up to date" と表示されました。

そこで、自宅のパソコンを確認したところ、常に動作していたパソコンでは "表示の自動更新" がオンになっています。 そうでない方のパソコンではオフになっていました。 このメニューオプションを触った覚えはない。 Xcode 6以前から存在していたのかどうかも、はっきりとはわからない。 しかし、このオプションが違いを生み出していたのです。


TL;DR, 質問で説明されているのと同じ問題がある場合、"Automatically Refresh Views" がオンになっていることを確認します (または、IB で更新が必要なときに手動で "Refresh All Views" を実行します)。