次のコードセットがあります。
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のキー値コーディングに準拠していません。
生成された警告のスクリーンショット:
私はKey-Valueコーディングに準拠した問題に精通しており、一般にそれらの解決方法を知っています...しかし、この問題をここで解決する方法がわかりません。ビューの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
また、その何かが間違っているとされていても、コンパイルソースとして含まれている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
and IBInspectable
ディレクティブがなくてもこれが当てはまると思います。