次のコードセットがあります。
#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
#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コードでも発生していました)
@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
に設定しました。
これにより、「Designables」行が追加されます。 「更新中」に留まり、ツールチップに「ターゲットのビルドを待機しています」と表示されます。このステータスから変更されることはありません。
検査する属性に移動すると、次のIBInspectable
プロパティを設定できます。
また、一度設定すると、「ユーザー定義のランタイム属性」にも表示されます。
ただし、「Designables」ステータスが「Updating」を超えて同じツールチップで移動することはありません(Cmd + Bを何度もビルドしてみましたが、何も変わりません)。
さらに、IBInspectable
プロパティを設定すると、それぞれに対して警告が表示されます。
IBDesignables-「UIView」のインスタンスのキーパス「borderColor」のユーザー定義ランタイム属性を無視します...このクラスはキー値コーディングに準拠していませんキーborderColor。
生成された警告のスクリーンショット:
私はキーバリューコーディングに準拠した問題に精通しており、一般的にそれらを解決する方法を知っています...しかし、私はここでこの問題を解決する方法がわかりません。ビューのIDインスペクターによると、ビューは「CustomView」です(これらのプロパティを持たない通常の「UIView」ではありません)。ビューが「CustomView」でない場合、これらの設計可能なプロパティは属性インスペクターに表示されませんよね?しかし、Interface Builderがこれらの属性をビューに適用しようとすると、ビューのクラスが「UIView」であると考えに戻り、属性を適用できません。
助けがありますか?いくつかの重要な詳細を省略した場合はお知らせください。しかし、それが価値があるのは、 このチュートリアルに正確に従いました (ObjC対Swift以外)です。また、このチュートリアルを別のマシンで正確に実行したことも魅力的でした(昨夜この投稿をするつもりでしたが、そのとき使用していたコンピューターにはこの問題はありませんでした)。
コメントに基づいて、おそらく.m
ファイルが含まれておらず、それが問題の原因である可能性が示唆されています。確かに、このシナリオに当てはまると思いますが、とにかくチェックしました。
最初にこれを試みたとき、IB_DESIGNABLE
クラスは別のUIKit
フレームワークの一部でなければならないという理解がありました。したがって、この最初のスクリーンショットから、CustomView
という1つのクラスを持つ「CustomViews」フレームワークをセットアップしたことがわかります。また、別のフレームワークにないことを除いて、OtherView
と同一のCustomView
も作成したことがわかります。ただし、ストーリーボードでは、両方のクラス間で同じ問題が引き続き発生します。
ここに、CustomView.m
がCustomViews
フレームワークでビルドするために含まれていることを示すスクリーンショットがあります。
一方、次のスクリーンショットはいくつかのことを示しています。
CustomViews.framework
は、メインプロジェクトに適切に含まれています。OtherView.m
もコンパイルソースとして含まれているため、CustomView
に問題がある場合でも、OtherView
は機能しますが、同じエラーが生成されます。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_DESIGNABLE
およびIBInspectable
ディレクティブがなくても、これらはユーザー定義のランタイム属性として作成されるため、これが当てはまると思います。
選択したビューをデバッグするというchriscoの提案に基づいて(これは既に行っていましたが、適切な手段で再試行しました)、エディターメニューの下部にある他のいくつかのオプションに気付きました。
「すべてのビューを更新」をクリックし、Xcodeが少し考えた後、ストーリーボードに予期したとおりにビューが表示されました(IBInspectable
プロパティを適切に適用)。
その後、プロセス全体を再度実行して、これが解決策であることを確認しました。
新しいクラスThirdView
を作成しました。このクラスも他のクラスと同じです。ビューのクラスをThirdView
に変更し、今回は少し異なるものを取得しました。
警告に対して[表示]をクリックします。
今回は新しいもの:
クラスThirdViewが存在しないため、カスタムクラスでオブジェクトにクラスUIViewを使用します。
これは、すでに存在するものよりも実際には役に立ちません。さらに、他の3つの警告が奇妙なことに6倍になりました。
とにかく、エディターのドロップダウンメニューから[すべてのビューを更新]をもう一度クリックすると、すべてのエラーがなくなり、もう一度、ビューが正しく表示されます。
それでも、これまで、私がやったことはすべて、家でめちゃくちゃにしたことがないものでした。自宅では、うまくいきました。そこで、「ビューの自動更新」をオンにして、テストのために「FourthView」を作成しました。もう一度、最初の3つと同じです。
ビューのクラスを「FourthView」に変更した後、designablesラベルは少しの間「更新中」と表示し、最後に「最新」と表示しました。
そこで、自宅でコンピューターをチェックしました。 「ビューの自動更新」は、常に動作していたコンピューターでオンになっています。そうではなかったコンピューターでオフにされました。このメニューオプションに触れたことを覚えていません。 Xcode 6よりも前に存在したかどうかを確認することすらできません。しかし、このオプションが違いを生んでいます。
TL; DR、質問で説明したのと同じ問題がある場合は、「ビューの自動更新」がオンになっていることを確認してください(または、IBで更新が必要な場合は手動で「すべてのビューを更新」)。
この問題を抱えている他の人への簡単なヒント:変数のタイプを忘れずに指定してください。
// Doesn't show up in IB
@IBInspectable var includeLeftSection = true
// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true
IBDesignableクラスがロードされない原因となる可能性のある詳細がいくつかあります。
カスタムビューを表示する問題のあるストーリーボード/ xibを選択します。
ナビゲーター領域で、XCodeワークスペース/プロジェクトのレポートナビゲーターに移動します。
XCodeの[エディター]メニューで、(nhgrifで述べたように)[すべてのビューを更新]オプションを押します。これにより、IBは、あなたが期待するものではないことを確実にするために、すべてのものをコンパイルするようになります。
レポートナビゲータで、「グループ別」をクリックしてコンテンツをフィルタリングし、「インターフェースビルダー」セクションを確認します。カスタムIBDesignableビューフレームワークをロードするために、多くのものをコンパイルすることがわかります。これらのターゲットのanyがコンパイルされない場合、(おそらく廃止された)単体テストターゲット(これらがこれらのビューまたはストーリーボードをロードするコードにまったく関係ない場合でも)の場合、IBはロードに失敗しますdll。
私の場合、IBは8つのターゲットをコンパイルしようとしました。そのうち4つは、最近のリファクタリングの変更以降に更新されていない単体テストです。
IBがこれらのクラスに関連していない、またはリンクされていないカスタムビューを適切に読み込んで表示するために私が行ったコードの変更/修正のほとんどは、これらの単体テストの実行中にストーリーボードを読み込むこともありません。しかし、IBは、作業のためにコンパイルするワークスペース全体に依存していました。
カスタムIBDesignableビュークラスで何も間違ったことはないと確信していますが、同じ警告Ignoring user defined runtime attribute for key path ..
が表示されました。
私の場合、Xcodeキャッシュに関係していることが判明しました。
rm -rf ~/Library/Developer/Xcode/DerivedData/*
DerivedData
をパージすると、警告は消えます。
私の例として、ポッド経由で CheckboxButton を使用しており、チェックボックスのグラフィックスがストーリーボードに表示されることはありませんが、以下の質問で説明されているのと同じ問題があります。
警告:IB Designables:クラスCheckboxButtonが存在しないため、カスタムクラスでオブジェクトにクラスUIViewを使用
そして
警告:IB Designables:「UIView」のインスタンス上のキーパス「checkColor」のユーザー定義のランタイム属性を無視します。値を設定しようとすると例外が発生します:[setValue:forUndefinedKey:]:このクラスはキーcheckColorのキー値コーディングに準拠していません。
私の問題を解決する方法は、次のように名前CheckboxButtonでモジュールを提供することでした:
注:CheckboxButtonは、使用しているモジュールの名前に置き換えてください。
他の誰かが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つ経験があります。
この問題とは関係のない問題がいくつかありましたが、その過程でクラスの変数から@IBInspectableを削除し、IDインスペクター(alt-Apple-3)から属性を削除しました。
コンポーネントの(コード)問題を修正した後、何回もすべてを更新しましたが、IDインスペクターの属性はまだ更新されていません。
最終的に、私はそれらが戻ってきたことに気付きましたただし、属性インスペクター(alt-Apple-4)のみ。そこで値を追加するとすぐに、IDインスペクターに再表示されました
デイブトーマスの答え 上記は、他のもの(派生データ、エディター>更新)がなかった場合に(逆の)ソリューションを提供しましたが、 XML ...する必要はありません!
Module
があります。私にとってこれは空であり、OPと同じエラーが発生していました。 Module
をプロジェクト名とBAMに設定しました-再構築後に機能し始めました!私は同じ問題を抱えていて、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
}
}
私はちょうどこの問題についてリンガーを調べました。私はここにリストされているすべてのものを運なしで試しました。これは永久に問題なく機能するストーリーボードであり、「ユーザー定義のランタイム属性を無視しています...」という問題で突然機能しなくなりました。
何らかの理由で、IBDesignableの1つからこのコードを削除すると、修正されました。
-(void)viewDidLoad {
self.clipsToBounds = YES;
}
これを削除すると、他のIBDesignableオブジェクトでも、すべての警告が消えます。この1つのステップで修正された理由はわかりませんが、おそらく他の人にも役立つでしょう。