1. ホーム
  2. ios

[解決済み] @IBDesignable のエラーです。IB Designablesです。自動レイアウトステータスの更新に失敗しました。Interface Builder Cocoa Touch ツールがクラッシュしました。

2022-04-25 09:39:54

質問

UITextViewの非常にシンプルなサブクラスで、テキストフィールドオブジェクトにネイティブで備わっている"Placeholder"機能を追加しています。以下は、そのサブクラスのコードです。

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
        }
    }
}

のクラスを変更した後 UITextView オブジェクトを、Identity Inspector の PlaceholderTextView を設定することができます。 Placeholder プロパティは、属性インスペクタでうまく表示されます。このコードはアプリを実行するときはうまくいくのですが、インターフェースビルダーではプレースホルダーテキストが表示されません。また、以下のようなノンブロッキングエラーが発生します(デザイン時にレンダリングされないのはこのためだと思われます)。

のエラーが発生しました。IB デザイナブル。自動レイアウトステータスの更新に失敗しました。Interface Builder Cocoa Touch ツールがクラッシュしました。

のエラーが発生しました。IB デザイナブル。PlaceholderTextView のインスタンスのレンダリングに失敗しました。ビューのレンダリングに200ms以上かかりました。描画コードが低パフォーマンスに悩まされる可能性があります。

何が原因でこのようなエラーが発生するのか、把握できていません。2つ目のエラーは、drawRect()をオーバーライドしていないため、意味がありません。何かアイデアはありますか?

解決方法は?

Interface Builder Cocoa Touch Toolがクラッシュしたときに生成されるクラッシュレポートがあります。これらは、以下の場所にあります。 ~/Library/Logs/DiagnosticReports という名前の IBDesignablesAgentCocoaTouch_*.crash . 私の場合は、私のコードの問題を特定する有用なスタック・トレースが含まれていました。