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


157

Ich habe eine sehr einfache Unterklasse von UITextView, die die "Platzhalter" -Funktionalität hinzufügt, die Sie im Textfeldobjekt nativ 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 ich die Klasse für das UITextViewObjekt im Identitätsinspektor in geändert habe PlaceholderTextView, kann ich die PlaceholderEigenschaft im Attributinspektor einwandfrei festlegen . Der Code funktioniert hervorragend, wenn die App ausgeführt wird, zeigt jedoch den Platzhaltertext nicht im Interface Builder an. Ich erhalte auch die folgenden nicht blockierenden Fehler (ich gehe davon aus, dass dies der Grund ist, warum es zur Entwurfszeit nicht gerendert wird):

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

Fehler: IB Designables: Fehler beim Rendern der Instanz von PlaceholderTextView: 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?


1
Ich habe diesen Fehler erhalten. Das Objekt hat in einem Testprojekt gut funktioniert, aber nicht in meinem Hauptprojekt (in einer Tabelle). Laut developer.apple.com/library/mac/recipes/… habe ich Editor auswählen> Ausgewählte Ansichten debuggen gewählt. Dann bekam ich "Ansichten konnten nicht debuggt werden" "Stellen Sie sicher, dass Ihr Framework die richtigen Build-Einstellungen für das Erstellen für iOS hat." In Google ist für diesen Fehler nichts aufgetaucht.
Matt

Antworten:


238

Beim Absturz des Interface Builder Cocoa Touch Tool werden Absturzberichte generiert. Die Arbeiten befinden sich in ~/Library/Logs/DiagnosticReportsund benannt IBDesignablesAgentCocoaTouch_*.crash. In meinem Fall enthielten sie eine nützliche Stapelverfolgung, die das Problem in meinem Code identifizierte.


1
Vielen Dank! Das war super hilfreich! Wo haben Sie die Informationen zu den Absturzberichten gefunden? :)
Ben-G

57
In meinem Fall habe ich festgestellt, dass initFrame(frame: CGRect)dies definiert werden muss. Tun Sie dies, wenn Sie Ihre eigenen initMethoden angeben.
Travis

Dies war die beste Lösung. Ich habe initWithFrame in einer der Ansichten nicht implementiert.
HotFudgeSunday

3
Ich habe die Diagnoseberichte verwendet und wie bei @Travis erwähnt, musste ich die init(frame: CGRect)explizit überschreiben, da ich eine benutzerdefinierte iniMethode hatte. Möglicherweise möchten Sie den Absturzbericht use of unimplemented initializer 'init(frame:)'direkt unter Application Specific Informationim Bericht durchsuchen. Danke Leute! Doppelter Gewinn in dieser Antwort!
Chris

4
Wie üblich ist diese Protokolldatei auch in der MacOS-App der Konsole unter der Gruppe " Benutzerdiagnoseberichte" verfügbar .
Paulo Mattos

51

Ich hatte das gleiche Problem ein paar Mal. Beide Male begann es, als ich eine IBDesignable-Feder in das Storyboard lud, als die Feder nicht in die Ansicht passen konnte (dh ich hatte eine Schaltfläche in der UIView, aber immer noch in der Feder). Nachdem ich behoben hatte, dass Xcode immer noch Fehler verursachte, startete ich Xcode neu, bis es zufällig aufhörte, mir den Fehler zu geben.

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 ist verschwunden. Ich weiß nicht, ob das immer funktioniert oder nicht.


2
Obwohl ich immer noch nicht verstehe, warum, wenn Sie keine der initMethoden überschreiben , zeigt der als Teil der Frage veröffentlichte Code die IB DesignablesFehler nicht mehr an und der Platzhalter wird im Interface Builder ordnungsgemäß gerendert.
Willington Vega

2
Vielleicht ist dies ein Fehler und wir müssen nur warten, bis er behoben ist. Vielleicht in Xcode 6.3.
Youssef Moawad

3
XCode 7.1.1 und noch vorhanden. Ein Neustart von XCode hat das Problem nicht gelöst. Ich musste alle Prozesse namens Interface Builder Cocoa Touch Tool manuell beenden, dann stürzte XCode ab, startete es neu und es begann zu funktionieren.
Cristian Pena

1
Wichtiger Punkt: In der Tat beenden FIRST die Interface Builder-Prozesse und stoppen dann XCode - wenn Sie es anders herum tun, bleibt das Problem bestehen ...
TheEye

2
XCode 8.1 Dieser Fehler tritt weiterhin auf. Ursprünglich verursacht durch das Fehlen einer Init-Überschreibung, blieb aber nach dem Hinzufügen von Init bestehen. Musste Interface Builder-Prozesse wie beschrieben beenden, dann starten Sie xcode neu, wie @TheEye sagt
John Fowler

39

In meinem Fall habe ich die nächste Methode in den Methoden initWithFrame / initWithCoder 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 ich nicht das Hauptpaket verwenden sollen , sondern das Paket der Klasse. Also habe ich diesen Code durch den folgenden 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.


1
Dies hat auch mein Problem behoben! Danke @jmoukel!
Edopelawi

Dieser hat mein Problem behoben. Mann!!! Ich konnte diese "bundleForClass" -Linie nicht bemerken, obwohl ich mir diese Lösung einige Male angesehen habe. :(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)in Swift
Cfr

14

Sie könnten Ihre benutzerdefinierte Ansicht im Interface Builder und dann Verwendung wählen Editor, Debug Selected Views. Es wird eine sogenannte IBDesignableAgentCocoaTouchDebug-Sitzung gestartet, wenn alle Haltepunkte (einschließlich Ausnahme-Haltepunkte) funktionieren und Sie den Ort, an dem Ihre Ansicht abstürzt, genau identifizieren können.


Perfekt! Dies fand auch mein Problem - eine falsche Schriftart. Dies erklärt, warum nur eines von sechs sehr ähnlichen IBDesignables fehlschlug.
Zkarj

13

Für Xcode 8 - Swift

Hinzufügen eines optionalen Werts als Standardwert, um @IBInspectableein Problem für mich zu verursachen.

Das wird nicht funktionieren:

@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()
    }
}

@DungTran Vor welchem ​​Problem stehen Sie?
Mohammad Zaid Pathan

1
Die optionale Handhabung verhindert den Absturz. Aber wissen Sie, was dazu führt, dass UIImage (benannt :) konsistent null zurückgibt?
ScottyBlades

Kommentierte aus dieser Code es für mich festgelegt `@objc @available (*, veraltet, umbenannt: "Backgroundcolor") @IBInspectable public var signatureBackgroundColor: UIColor = .white {didSet {background = signatureBackgroundColor}}`
PhoneyDeveloper

9

Ich hatte ähnliche Probleme mit dem Interface Builder beim Rendern von Designables.

Mit der in dieser Antwort vorgeschlagenen Technik konnte ich das Problem auf die Verwendung von Bildliteralen zurückführen.

Absturz beim Rendern

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

Kein Rendering-Absturz

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

Du bist ein Held.
Nathangitter

Irgendeine Idee, warum Bildliterale mit IB nicht kompatibel sind? Ich hatte das gleiche Problem.
SwiftsNamesake

6

Wenn Sie in einer Ansicht Ihres Storyboards einige alte benutzerdefinierte Attribute haben (die für die aktuelle Ansicht nicht gültig sind), kann dies zum Absturz Ihres Agenten führen.

Außerdem passiert es manchmal nur wegen eines bösen Fehlers von Xcode. Wenn Sie sich im Storyboard befinden, deaktivieren Sie das Kontrollkästchen Editor> Ansichten automatisch aktualisieren, verschieben Sie es in eine andere Datei, bereinigen Sie Ihr Projekt und starten Sie es neu. Nachdem Sie das Storyboard erneut aufgerufen haben, können Sie auf Editor> Ansichten aktualisieren klicken und die automatische erneut aktivieren. Dieser hat auch mein Problem einmal gelöst.

Wenn beides nicht funktioniert hat, haben Sie wahrscheinlich etwas an Ihrer IBDesignable-Ansicht falsch gemacht. Wählen Sie also Ihre abgestürzten Ansichten im Storyboard aus und debuggen Sie, indem Sie auf Editor> Debug-Ansichten klicken


Du bist ein Geschenk Gottes.
Andrew Car

4

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
}

Sie sollten immer beide init-Methoden implementieren. Init with frame wird verwendet, wenn Sie Ihre Ansicht über Code initiieren, und init with aDecoder wird über InterfaceBuilder verwendet.
Skodik.o

4

Ich hatte das gleiche Problem und löste es durch Hinzufügen der 'use_frameworks!' zum Podfile meines Projekts.

Hoffe es hilft dir.


Dies funktionierte für mich, als ich dieses Problem mit JVFloatLabeledTextField
saswanb

Dies war es, was für mich funktionierte, als ich ein älteres Obj-C-Projekt übernahm, das ziemlich veraltet war. Der IB leuchtet danach wie ein Weihnachtsbaum! Danke dir.
zeichnete ..

3

In meinem Fall hing es irgendwie mit einem Karthago-Framework zusammen, das ich verwendete. Ich musste $ (PROJECT_DIR) / Carthage / Build / iOS zur Build-Einstellung Runpath Search Paths hinzufügen


Nachdem ich alle anderen veröffentlichten Lösungen ausprobiert hatte ... war dies die einzige Lösung, die für mich funktioniert hat! Vielen Dank!
Joel

3

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 großartig!

Überprüfen Sie dies .


1

Als ich dies debuggte, fand ich heraus, dass es einige Klassen gibt, die die Benutzeroberfläche modifizieren. In der Regel marquelabel, eine Unterklasse von UILabel oder einer anderen Klasse, die UIView unterordnet und zur Laufzeit ui zeichnet und mit der Autolayout-Engine kollidiert. Geben Sie für diese benutzerdefinierten Ansichten eine feste Breite oder Höhe an. Wenn es Ihr Problem nicht löst, versuchen Sie folgende Lösungen: -

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

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 -> Speicherorte -> 3. Klicken Sie auf einen kleinen grauen Pfeil mit dem abgeleiteten Datenpfad -> 4. Wählen Sie Ihr Projekt aus -> 5. Löschen Sie alle darin enthaltenen Ordner -> 6. Beenden Sie Xcode und öffnen Sie es erneut


1

Fügen Sie es am Ende Ihres Podfiles hinzu und führen Sie es aus 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

Fügen Sie dieses Skript am Ende von my hinzu Podfileund führen Sie es pod installerneut 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

Ein Hauptproblem besteht darin, dass Sie beim Erstellen von @ IBDesignable sicherstellen, dass die Cocoapod- Datei nicht in den UITests enthalten ist. Andernfalls wird dieser Absturz verursacht.


0

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


0

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


0

Für mich war es ein fehlendes Signaturzertifikat, da ich die App nie ausgeführt habe und Xcode noch kein Zertifikat erstellt hat. Nachdem ich die App ausgeführt hatte, IBDesignablefunktionierte das Rendern einwandfrei.


0

Es ist so, als hätten Sie Code von einem anderen Entwickler erhalten und diesen Fehler erhalten. Renn einfach

pod install

Das hat bei mir funktioniert. Ich hoffe es hilft.


0

Stellen Sie sicher, dass Sie Assets oder Schriftarten, die in Ihrem Projekt hinzugefügt wurden, nicht direkt initialisieren UIImageoder UIFontverwenden.

Ich erstelle immer eine private func setUp()in meinen @IBDesignablebenutzerdefinierten UIKlassen. welches heißt von init(frame: CGRect), init?(coder aDecoder: NSCoder). Also habe ich endlich setup()folgendes 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
}

-1

Lassen Sie es einfach auf dem Simulator erstellen und ausführen, wenn Sie irgendwo anders im Projekt einen Fehler haben. Kommentieren Sie es einfach aus und führen Sie zuerst designable aus, um designable zu aktualisieren und die anderen Codes zu kommentieren. Für mich geht das.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.