wake-up-neo.com

@IBDesignable Absturzagent

Wenn ich meine eigene UIButton- extended Klasse schreibe und @IBDesignable mache, erhalte ich im Interface Builder zwei Fehler, nämlich:

  • Main.storyboard: Fehler: IB Designables: Fehler beim Aktualisieren des Status des automatischen Layouts: Der Agent ist abgestürzt, weil der FD geschlossen wurde
  • Main.storyboard: Fehler: IB Designables: Instanz von RandjeUIButton konnte nicht gerendert werden: Der Agent ist abgestürzt

Hier ist mein Code:

import UIKit

@IBDesignable
class RandjeUIButton: UIButton {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.backgroundColor = UIColor.blackColor()
    }
}

Ich arbeite in Xcode 7 Beta 2 unter OS X 10.11 Beta 2. (Wird in VM ausgeführt)

64
jbehrens94

Der Interface Builder von Xcode erfordert, dass Sie beides oder keine initializer für @IBDesignable-Klassen implementieren, um sie ordnungsgemäß in IB darzustellen. 

Wenn Sie required init(coder aDecoder: NSCoder) implementieren, müssen Sie auch init(frame: CGRect) überschreiben, andernfalls "der Agent stürzt ab", wie in den Fehlern, die von Xcode ausgegeben werden.

Fügen Sie dazu der Klasse den folgenden Code hinzu:

override init(frame: CGRect) {
    super.init(frame: frame)
}
101
mathielo

Ich habe das gleiche Problem gefunden und es auf diese Weise gelöst:

  1. Das Problem:

fehler: IB Designables: Fehler beim Aktualisieren des Status des automatischen Layouts: Der Agent ist abgestürzt

  1. Suchen Sie die Debug-Schaltfläche in der Inspektionsdatei und klicken Sie darauf.

debug

  1. Dann sagt Ihnen der Xcode, wo sich das Prolem befindet ..__ In meinem Fall lasse ich das IBDesignable vor der Klasse fallen.

  2. Dann reinige und baue ich es neu auf, der Fehler ist verschwunden

22
Azure Yu

In Xcode 7.3 funktionierte keine der oben genannten Lösungen für mich, aber die akzeptierte Antwort auf diese Frage lautete: Fehler beim Erstellen der Instanz von IB Designables

  1. Xcode-abgeleitete Daten für das Projekt löschen. Sie befinden sich in ~/Library/Developer/Xcode/DerivedData
  2. Reinigen Sie Ihren aktuellen Build mit K
  3. Bauen Sie Ihr Projekt auf
  4. Gehen Sie im Storyboard zum Menü "Bearbeiten" und führen Sie die Option "Alle Ansichten aktualisieren" aus. Warten Sie, bis der Build abgeschlossen ist, und die Fehler sollten verschwunden sein

Ich brauchte nicht den vierten Schritt, um das Problem zu lösen (und meinen PaintCode-drawRect-UIView in das Storyboard zu malen), der hier nur für den Fall enthalten ist.

Credit an @Mojtaba und @WeZZard

11
Glenn Barnett

Es gibt eine Vielzahl von Problemen, die dies verursachen können. Starten Sie die Konsole und suchen Sie nach dem Absturzbericht IBDesignablesCocoaTouch... 

Ich habe gerade ein Problem mit einem Drittanbieter-Design behoben, das Probleme mit der valueForKey-Semantik hatte.

9
voidref

Für mich war es nicht #if !TARGET_INTERFACE_BUILDER, der mich erwischt hat. Im Grunde hatte ich etwas Code, der dazu führen würde, dass ich auf einen Pfad in meinem Bundle zugreifen würde ...

Bundle.main.path(forResource: "Foo", ofType: "plist")

Das Problem ist, dass Bundle.main nicht Ihre App ist, wenn sie in IB (und nicht in Ihrer App) ausgeführt wird.

(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)

Die Antwort darauf ist einfach, Ihren @IBDesignable UIView-Code sorgfältig zu überprüfen und #if !TARGET_INTERFACE_BUILDER für alles zu verwenden (in meinem Fall Aufrufe von CoreLocation), das zum Entwurfszeitpunkt keinen Sinn ergibt.

Wie ich debuggen und das gefunden habe

Folgendes wird angezeigt, wenn Sie den Editor -> Debug Selected View bei der Auswahl Ihres @IBDesignable UIView in Ihrem Storyboard verwenden:

 This is what you see when using the <code>Editor -> Debug Selected View</code> while selecting your <code>@IBDesignable UIView</code> in your storyboard

Sie stürzen dann am richtigen Ort ab

 The Debug Navigator

Wie Sie sehen können, hat initXXXX in meinem Fall eine assert ausgeführt, die zur Entwurfszeit abstürzte, weil sie in meinem Bundle nach einem Wert in der Datei suchte - nämlich Xcode - zur Entwurfszeit.

7
StuFF mc

Ich habe etwas wirklich Wichtiges gefunden, wenn ich ein UIImage in einer Klasse mit der Bezeichnung @IBDesignable verwende. Das klassische UIImage-Init würde den Agenten zum Absturz bringen:

let myImage = UIImage(named: String) // crash the agent

Die Lösung ist die Verwendung dieser init-Methode von UIImage:

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)

Arbeitscode-Beispiel: 

let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))

Wo selbst ist Ihre Klasse mit dem Schlüsselwort @IBDesignable. Xcode 9.4, Swift 4.1

3
Adrien Yvon

Öffnen Sie einfach einen Code in einem anderen Xcode-Setup-System. In meinem Fall hat es funktioniert.

2
Charmi

So löse ich dieses Problem:

  • Stellen Sie sicher, dass die Auslässe ordnungsgemäß initialisiert sind
  • @IBInspectable-Eigenschaften werden ordnungsgemäß initialisiert
  • klicken Sie in der xib-Datei auf den Platzhalter des Besitzers der Datei, gehen Sie zum Identitätsinspektor und stellen Sie sicher, dass er keine Standardwerte hat

import UIKit

@IBDesignable class TestView: UIView {
    
    @IBOutlet weak var label: UILabel!
    
    
    @IBInspectable var textLabel1: String? {
        get {
            return label.text
        }
        set {
            label.text = newValue
        }
    }

    
    // MARK: Setup
    
    var view1: UIView!
    var nibName: String = "TestView"
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        xibSetup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        xibSetup()
    }
    
    private func xibSetup() {
        view1 = loadViewFromNib()
        
        view1?.frame = self.bounds
        view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        
        if view1 != nil {
            addSubview(view1!)
            //textLabel1 = "ok"
        }
    }
    
    private func loadViewFromNib() -> UIView? {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        for object in nib.instantiateWithOwner(self, options: nil) {
            if let view: UIView = object as? UIView {
                return view
            }
        }
        return nil
    }
    
    
}

Verwendungszweck:

 enter image description here

1

XCode 10, Swift 4.2

Ich habe eine Antwort gefunden hier

Die Lösung war einfach: Die Art und Weise, wie das Bundle in der required init?(coder aDecoder: NSCoder)-Methode meiner benutzerdefinierten Ansichtsklasse aufgelöst wurde, wurde geändert.

    Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

musste geändert werden

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
0
escapedcanadian

Ich habe einen ganzen Tag damit verschwendet und endlich habe ich mein Problem gelöst  enter image description here

Ich habe Build for Target als 8.0 ausgewählt und es fixiert alles für mich.

0
Sam