wake-up-neo.net

@IBDesignable Fehler: IB Designables: Fehler beim Aktualisieren des automatischen Layoutstatus: Interface Builder Cocoa Touch Tool ist abgestürzt

Ich habe eine sehr einfache Unterklasse von UITextView, die die Funktionalität "Platzhalter" hinzufügt, die Sie nativ zum Textfeldobjekt finden können. Hier ist mein Code für die Unterklasse:

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

Nachdem Sie die Klasse für das UITextView-Objekt im Identitätsinspektor in PlaceholderTextView geändert haben, kann ich die Placeholder-Eigenschaft im Attributinspektor festlegen. Der Code funktioniert gut, wenn die App ausgeführt wird, der Platzhaltertext wird jedoch nicht im Interface-Builder angezeigt. Ich erhalte außerdem die folgenden nicht blockierenden Fehler (ich gehe davon aus, dass das Rendern daher nicht zur Entwurfszeit erfolgt):

fehler: IB Designables: Fehler beim Aktualisieren des Status des automatischen Layouts: Interface Builder Cocoa Touch Tool ist abgestürzt

fehler: IB Designables: Instanz von PlaceholderTextView konnte nicht gerendert werden: Das Rendern der Ansicht dauerte länger als 200 ms. Ihr Zeichnungscode kann unter einer langsamen Leistung leiden.

Ich kann nicht herausfinden, was diese Fehler verursacht. Der zweite Fehler macht keinen Sinn, da ich drawRect () nicht einmal überschreibe. Irgendwelche Ideen?

149
Albert Bori

Es werden Absturzberichte generiert, wenn das Interface Builder Cocoa Touch Tool abstürzt. Diese Arbeiten befinden sich in ~/Library/Logs/DiagnosticReports und heißen IBDesignablesAgentCocoaTouch_*.crash. In meinem Fall enthielten sie einen nützlichen Stack-Trace, der das Problem in meinem Code identifizierte.

225
Petter

Ich hatte das gleiche Problem ein paar Mal. Beide Male begann es, als ich eine IBDesignable-Spitze auf das Storyboard lud, als die Spitze nicht in die Ansicht passte (dh ich hatte einen Button aus der UIView, aber immer noch in der Spitze). Nachdem ich behoben hatte, dass xCode mir immer noch Fehler gab, startete ich Xcode neu, bis er zufällig aufhörte und mir den Fehler gab. 

Ich hoffe das hilft.

UPDATE: Ich habe gerade alle Prozesse mit dem Namen "Interface Builder Cocoa Touch Tool" beendet, Xcode neu gestartet und der Fehler wurde behoben. Ich weiß nicht, ob das immer funktionieren wird oder nicht.

50
Dustin Williams

In meinem Fall habe ich die nächste in den initWithFrame/initWithCoder-Methoden ausgeführt, um die Ansicht zu erstellen:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Es sieht so aus, als hätte ichNotdas Main Bundle verwenden sollen, sondern das Bundle der Klasse. Also habe ich diesen Code für Folgendes ersetzt und es hat funktioniert:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

Ich dachte, vielleicht könnte das jemandem helfen.

38
jmoukel

Sie können Ihre benutzerdefinierte Ansicht im Interface Builder auswählen und dann Editor, Debug Selected Views verwenden. Es wird die so genannte IBDesignableAgentCocoaTouch-Debug-Sitzung gestartet, wenn alle Haltepunkte (einschließlich der Haltepunkte für Ausnahmen) funktionieren und Sie den Ort Ihrer Ansicht genau identifizieren können.

14
Fyodor Volchyok

Für XCode8 - Swift  

Das Hinzufügen eines optionalen Werts als Standardwert für @IBInspectable verursacht ein Problem für mich.

Das funktioniert nicht:

@IBInspectable var repeatImage:UIImage = UIImage(named:"myImage")!{
      didSet{
       // configureView
      }
}

Das sollte funktionieren:

@IBInspectable var repeatImage:UIImage = RepeatImageView.getDefaultImage(){
        didSet{
           // configureView()
        }
}

class func getDefaultImage()->UIImage{
        if let defaultImage = UIImage(named: "myImage"){
            return defaultImage
        }else{
            return UIImage()
        }
}
11
Zaid Pathan

Ich hatte ähnliche Interface Builder-Probleme beim Rendern von Designable.

Mit der in dieser Antwort vorgeschlagenen Technik konnte ich das Problem auf die Verwendung von Bildliteralen aufspüren.

Rendering abstürzen

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

Kein Rendering-Absturz

self.backgroundImage.image =  UIImage(named: "rectangleCenter")
9
Nick Cross

Wenn Sie old benutzerdefinierte Attribute (die für die aktuelle Ansicht nicht gültig sind) in einer beliebigen Ansicht Ihres Storyboards haben, kann dies dazu führen, dass Ihr Agent abstürzt. 

Außerdem passiert es manchmal nur aufgrund eines bösen Fehlers von Xcode. Wenn Sie sich beim Storyboard befinden, deaktivieren Sie das Kontrollkästchen Editor> Ansichten automatisch aktualisieren. Wechseln Sie dann in eine andere Datei, löschen Sie das Projekt und starten Sie es erneut. Nachdem Sie das Storyboard erneut aufgerufen haben, können Sie auf Editor> Ansichten aktualisieren klicken und die automatische erneut prüfen. Dieser hat auch einmal mein Problem gelöst.

Wenn beides nicht funktioniert hat, haben Sie wahrscheinlich etwas falsch mit Ihrer IBDesignable-Ansicht gemacht. Wählen Sie daher Ihre abgestürzten Ansichten im Storyboard aus, und klicken Sie auf Editor> Debug-Ansichten, um das Debugging zu starten

6
Yusuf Kamil AK

Dies ist bei dieser Frage nicht der Fall, aber vielleicht helfe ich jemand anderem. 

Ich hatte ein ähnliches Problem, als ich in meiner @IBDesignable-Klasse nicht beide implementiert habe:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // custom setup
}

override init(frame: CGRect) {
    super.init(frame: frame)

    // custom setup
}
4
tzaloga

In meinem Fall war es ein Problem mit OneSignal. Anscheinend haben sie einen Fehler in der Version 2.2.0 und höher. Auf 2.1.6 umgestellt und alles ist wieder gut!

Überprüfen Sie this .

3
Paul Berg

Ich hatte das gleiche Problem, aber ich habe es durch das Hinzufügen von 'use_frameworks!' Zu Ihrem Projekt PodFile.hope könnte es Ihnen helfen.

3
Jimmy Ng

In meinem Fall hatte es irgendwie mit einem Karthago-Rahmen zu tun, den ich verwendete. Ich musste $ (PROJECT_DIR)/Carthage/Build/iOS zur Build-Einstellung Runpath Search Paths hinzufügen

3
AkademiksQc

Beim Debuggen habe ich herausgefunden, dass es einige Klassen gibt, die die Benutzeroberfläche modifizieren. Typischerweise Marquelabel, das eine Unterklasse von UILabel oder eine andere Klasse ist, die UIView und UIliew zur Laufzeit zeichnet und mit der Autolayout-Engine kollidiert. Geben Sie für diese benutzerdefinierten Ansichten feste Breite oder Höhe an. Wenn sich das Problem dadurch nicht beheben lässt, versuchen Sie folgende Lösungen: -

Lösung 1: - Kommentieren Sie #use_frameworks in Ihrer Pod-Datei.

Lösung 2: - Versuchen Sie, abgeleitete Daten zu löschen. 1. Schließen Sie das Editorfenster Ihres Xcodes und beenden Sie den Simulator -> 2. Gehen Sie zu Xcode-Einstellungen -> Standorte -> 3. Klicken Sie auf den kleinen grauen Pfeil, der den abgeleiteten Datenpfad zeigt -> 4. Wählen Sie Ihr Projekt aus -> 5. Löschen Sie alle darin enthaltenen Ordner -> 6. Xcode beenden und erneut öffnen

1
Ashish Pisey

Fügen Sie dieses Skript am Ende meiner Podfile hinzu und führen Sie pod install erneut aus.

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
1
Haroldo Gondim

Fügen Sie es am Ende Ihrer Poddatei hinzu und führen Sie 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
1
Tissa

Wenn Sie @ IBDesignable erstellen, stellen Sie sicher, dass die Datei cocoapod nicht in den UITests enthalten ist. Andernfalls wird dies zum Absturz führen.

1
Modesto Cabrera

Es ist so, als ob Sie Code von einem anderen Entwickler erhalten hätten und Sie diese Fehlermeldung erhalten 

pod install

Das hat für mich funktioniert. Ich hoffe es hilft.

0
Dhruv Khatri

Für mich fehlte ein Signaturzertifikat, da ich die App nie ausgeführt habe, sodass Xcode noch kein Zertifikat erstellt hat. Nachdem ich die App ausgeführt hatte, funktionierte das IBDesignable-Rendering einwandfrei.

0

Ich finde, der Grund dafür ist, dass Ihr Xib nicht die gleiche Größe hat wie das Design im Storyboard. Stellen Sie sicher, dass der xib die gleiche Höhe und Breite hat. 

0
user6476366

Mir fehlte gerade diese Codezeile platform :ios, '7.0' und Problem wurde gelöst. Nur diese Zeile in Ihrer Pod-Datei und das Update Ihres Pod-Problems werden behoben.

0

Stellen Sie sicher, dass SieUIImageoderUIFontnicht direkt mit in Ihrem Projekt hinzugefügten Assets oder Schriftarten initialisieren.

Ich erzeuge immer eine private func setUp() in meinen @IBDesignable benutzerdefinierten UI-Klassen . Die von init(frame: CGRect), init?(coder aDecoder: NSCoder) aufgerufen wird. Also habe ich die setup() wie folgt aktualisiert.

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
}
0
Sauvik Dolui