[解決済み] IB_DESIGNABLE, IBInspectable -- インターフェースビルダーが更新されない
質問
次のようなコードがあります。
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.storyboard
とLaunchScreen.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_DESIGNABLE
と
IBInspectable
ディレクティブがありますが、これらは 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" を実行します)。
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UIDevice uniqueIdentifierは非推奨 - どうしたらいいの?
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] Swift 3でディスパッチキューを作成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] 文字列の長さを取得する
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] UINavigationBarの1px下の行を非表示にする方法
-
[解決済み] UIDevice uniqueIdentifierは非推奨 - どうしたらいいの?
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] CocoaPodsの最新バージョンにアップデートしますか?
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。