web-dev-qa-db-ja.com

(UIView)で(cornerRadius)ユーザー定義の検査済みプロパティを設定できませんでした

詳細

WWDC 2014のセッション411Interface Builderの新機能」を参照し、@IBDesignableクラスを作成するためのフレームワークの作成方法を試していました。アプリケーションを実行せずにStoryboardで私の変更をプレビューします。

クラスを特定のビューに追加すると、@IBInspectableプロパティが正しく表示され、次のコードでビューが正しくレンダリングされます。

コード

@IBDesignable
class MyView: UIView {
    @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
        didSet {
            layer.borderColor = borderColor.CGColor
        }
    }

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

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

    @IBInspectable var masksToBounds: Bool = false {
        didSet {
            layer.masksToBounds = masksToBounds
        }
    }
}

ログ

これらの属性がser Defined Runtime Attributes(Under Identity Inspector)に追加されていることに気付きました。これから私が期待しているのは、特定のビューで行った変更を維持するためにコードを実行するときです。

アプリケーションを実行すると、ビューはser Defined Runtime Attributesをロードせず、出力でこのエラーを表示します(クラッシュではありません):

Unknown class MyClass in Interface Builder file
Failed to set (cornerRadius) user defined inspected property on (UIView)

質問

アプリケーションがロードされない原因は何ですかユーザー定義のランタイム属性Identity Inspectorの下に追加したものですか?

28
E-Riddie

コードは正しいです。
@ IBDesignableを宣言すると、すべての@IBInspectableプロパティがユーザー定義のランタイム属性としてInterface Builderに公開されます。

問題-

Interface Builderファイルの不明なクラスMyClass

インターフェイスビルダーがクラスを見つけることができなかったことを意味します。アプリに存在しない間違ったclassを設定しました。
customViewクラスはMyViewですが、Interface BuilderにはMyClassがあります

enter image description here

修正する解決策-

  • インターフェースビルダーで正しいクラスを設定します。あなたの場合はMyView
  • 設計可能ステータスを確認します。 Up to dateである必要があります。それが何かが間違っているということです。

enter image description here

Also顧客Designableを削除することにした場合は、

  • カスタムクラスを削除
  • ユーザー定義のランタイム属性を削除

enter image description here

41

質問のタイトルに基づいて、わずかに異なる問題を抱えてここに来る人もいます(私がしたように)。もし、あんたが

  • @IBInspectibleを追加しました
  • そして、それをコードで削除しました

その後、次のようなエラーが表示されることもあります

[カスタムビュー]でユーザー定義の検査済みプロパティ(xxx)を設定できませんでした...:このクラスはキー[xxx]のキー値コーディングに準拠していません。

解決策は、古いプロパティを削除することです。

enter image description here

クラスのIDインスペクターを開き、[ユーザー定義のランタイム属性]でプロパティ名を選択し、マイナスボタン(-)を押します。

繰り返しますが、これはOPの質問に対する答えではありませんが、ここに来る他の誰かの問題に対する答えかもしれません。

23
Suragch

indentityインスペクターでユーザー定義のランタイム属性を追加

layer.cornerRadius-文字列を入力

first

attibutesインスペクターに移動して、「Clip Subviews」を選択した後

second

0
Pablo Ruan