私はあなたがText Fieldオブジェクトにネイティブで見つけることができる「プレースホルダー」機能を追加するUITextViewの非常に単純なサブクラスを持っています。これが私のサブクラスのコードです。
import UIKit
import Foundation
@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
@IBInspectable var placeholder: String = "" {
didSet {
setPlaceholderText()
}
}
private let placeholderColor: UIColor = UIColor.lightGrayColor()
private var textColorCache: UIColor!
override init(frame: CGRect) {
super.init(frame: frame)
self.delegate = self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidBeginEditing(textView: UITextView) {
if textView.text == placeholder {
textView.text = ""
textView.textColor = textColorCache
}
}
func textViewDidEndEditing(textView: UITextView) {
if textView.text == "" && placeholder != "" {
setPlaceholderText()
}
}
func setPlaceholderText() {
if placeholder != "" {
if textColorCache == nil { textColorCache = self.textColor }
self.textColor = placeholderColor
self.text = placeholder
}
}
}
Identity InspectorでUITextView
オブジェクトのクラスをPlaceholderTextView
に変更したら、Placeholder
プロパティを属性インスペクタで正しく設定できます。このコードはアプリの実行時にはうまく機能しますが、インターフェイスビルダーにプレースホルダーテキストは表示されません。また、次のようなノンブロッキングエラーが発生します(設計時にレンダリングされないのはこのためです)。
error:IB Designables:自動レイアウトステータスの更新に失敗しました:Interface Builder Cocoa Touch Toolがクラッシュしました
error:IB Designables:PlaceholderTextViewのインスタンスのレンダリングに失敗しました:ビューのレンダリングに200ミリ秒以上かかりました。描画コードはパフォーマンスが低下する可能性があります。
これらのエラーの原因を突き止めることはできません。 drawRect()もオーバーライドしていないので、2番目のエラーは意味がありません。何か案は?
Interface Builder Cocoa Touch Toolがクラッシュするとクラッシュレポートが生成されます。論文は~/Library/Logs/DiagnosticReports
にあり、IBDesignablesAgentCocoaTouch_*.crash
という名前です。私の場合、それらは私のコードで問題を特定する有用なスタックトレースを含んでいました。
私は数回同じ問題を抱えています。どちらの場合も、ペン先がビューに収まらないときにIBDesignableペン先をストーリーボードにロードしていたときに開始しました(つまり、UIViewからボタンを離してもまだペン先に入っていた)。 xCodeでエラーが発生することを修正したら、ランダムにエラーが発生するまでXcodeを再起動しました。
これが役に立つことを願っています。
更新:私はちょうど "Interface Builder Cocoa Touch Tool"という名前のすべてのプロセスを強制終了し、Xcodeを再起動するとエラーは消えました。これが常にうまくいくかどうかわからない。
私の場合は、initWithFrame/initWithCoderメソッドで次のようにビューを作成していました。
className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
NotMain Bundleを使用することになっていましたが、その代わりにクラス。それで、私はそのコードを次のように置き換えて、それはうまくいきました:
bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];
多分これは誰かに役立つかもしれないと思った。
Interface Builderでカスタムビューを選択してからEditor
、Debug Selected Views
を使用できます。すべてのブレークポイント(例外ブレークポイントを含む)が機能すると、いわゆるIBDesignableAgentCocoaTouch
デバッグセッションが開始され、ビューがクラッシュした場所を正確に識別できます。
XCode8 - Swiftの場合
@IBInspectable
にデフォルト値としてオプションの値を追加すると私に問題が生じます.
これはうまくいきません:
@IBInspectable var repeatImage:UIImage = UIImage(named:"myImage")!{
didSet{
// configureView
}
}
これでうまくいくはずです
@IBInspectable var repeatImage:UIImage = RepeatImageView.getDefaultImage(){
didSet{
// configureView()
}
}
class func getDefaultImage()->UIImage{
if let defaultImage = UIImage(named: "myImage"){
return defaultImage
}else{
return UIImage()
}
}
Designableをレンダリングする際に同様のInterface Builderの問題が発生していました。
これで提案されたテクニックを使用して 答え 私は問題をイメージリテラルの使用に突き止めることができました。
レンダリングクラッシュ
self.backgroundImage.image = #imageLiteral(resourceName: "rectangleCenter")
レンダリングがクラッシュしない
self.backgroundImage.image = UIImage(named: "rectangleCenter")
ストーリーボードのどのビューにも古いユーザー定義属性(現在のビューでは無効です)がある場合、実際には、エージェントがクラッシュする可能性があります。
その上、時々それはXcodeの厄介なバグのためだけに起こります。チェックアウトするには、ストーリーボードに入ったら[エディタ]> [ビューの自動更新]のチェックを外してから別のファイルに移動し、プロジェクトを消去して再起動します。ストーリーボードをもう一度入力した後は、[エディタ]> [ビューの更新]をクリックして、自動ストーリーボードをもう一度確認できます。それはまた私の問題を一度解決した。
両方ともうまくいかなかった場合は、おそらくIBDesignableビューについて何か間違ったことをしたことになるので、ストーリーボードでクラッシュしたビューを選択し、Editor> Debug Viewsをクリックしてデバッグします。
これはこの質問の場合ではありませんが、多分私は他の誰かを助けます。
@IBDesignableクラスで両方を実装しなかった場合も、同様の問題がありました。
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// custom setup
}
override init(frame: CGRect) {
super.init(frame: frame)
// custom setup
}
同じ問題がありましたが、「use_frameworks!」を追加して解決しました。あなたのプロジェクトのPodFileに。それはあなたを助けることができると思います。
私の場合、それはOneSignalの問題でした。どうやら、彼らはバージョン2.2.0以降にバグがあります。 2.1.6に切り替えれば、すべてがまた最高です!
this をチェックしてください。
私の場合、それはどういうわけか私が使っていたカルタゴフレームワークに関連していました。私はRunpath Search Paths build設定に$(PROJECT_DIR)/ Carthage/Build/iOSを追加しなければなりませんでした
私はこれをデバッグしたときに私はUIを変更しているいくつかのクラスがあることがわかった。通常、marquelabelは、UILabelのサブクラス、または実行時にUIViewをサブクラス化してuiを描画し、Autolayoutエンジンと衝突する他のクラスです。これらのカスタムビューの幅や高さを固定してみてください。それでも問題が解決しない場合、以下の解決策を試してください。 -
解決策1: - ポッドファイル内の#use_frameworksのコメントを外します。
解決策2: - 派生データを削除してみます。 1. Xcodeのエディタウィンドウを閉じてシミュレータを終了します。 - > 2. Xcodeの設定 - >場所 - > 3.派生データパスを示す小さな灰色の矢印をクリックします - > 4.プロジェクトを選択します - > - > 6. Xcodeを終了して再度開く
このスクリプトを私のPodfile
の最後に追加して、もう一度pod install
を実行しました。
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings.delete('CODE_SIGNING_ALLOWED')
config.build_settings.delete('CODE_SIGNING_REQUIRED')
end
end
それをPodfileの一番下に追加してpod install
を実行してください。
# Workaround for Cocoapods issue #7606
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings.delete('CODE_SIGNING_ALLOWED')
config.build_settings.delete('CODE_SIGNING_REQUIRED')
end
end
大きな問題は@ IBDesignableがcocoapodを確実にするようにファイルをUITestsに含まないと作成している時です。
他の開発者からコードを入手したときにこのエラーが発生するようなものです。とにかく走れ
pod install
これは私のために働きました。それが役に立てば幸い。
私はアプリを実行したことがないため、署名証明書がありませんでした。そのため、Xcodeはまだ証明書を作成していません。アプリを実行すると、IBDesignable
レンダリングは正常に機能しました。
その理由は、あなたのxibがストーリーボードのデザインと同じサイズではないことにあります。 xibの高さと幅が同じであることを確認してください。
私はこのコード行platform :ios, '7.0'
を見逃していただけで、問題は解決されました。ポッドファイルのこの行とポッドの問題を更新するだけで解決されます。
プロジェクトに追加されたアセットまたはフォントを使用してUIImage
またはUIFont
を直接初期化していないことを確認してください。
私はいつも@IBDesignable
カスタムUI
クラスにprivate func setUp()
を作成します。これはinit(frame: CGRect)
、init?(coder aDecoder: NSCoder)
から呼び出されます。それで私はついにsetup()
を以下のように更新しました。
private func setUp() {
//... Doing initial configurations
// iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
if let icon = UIImage(named: "IconImageName") {
iconImageView.image = icon
iconImageView.frame.size = icon.size
}
// nameLabel.font = UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
if let font = UIFont(name: "Calibri-Light", size: size) {
nameLabel.font = font
} else {
nameLabel.font = UIFont.systemFont(ofSize: size)
}
// Doing other stuffs
}