次のコードセットがあります。
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
もコンパイルソースとして含まれているので、 に問題があっても動作するはずですが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