@IBDesignable Absturzagent

74

Wenn ich meine eigene erweiterte UIButtonKlasse schreibe und sie erstelle @IBDesignable, 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: Fehler beim Rendern der Instanz von RandjeUIButton: 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)

jbehrens94
quelle
11
Sie müssen außer Kraft zu setzen init(frame: CGRect)und
Eric Qian
3
Ich habe das getan, die Fehler über den Agenten werden jetzt abgewiesen. Ich sehe immer noch, dass die Erstellung im Interface Builder fehlgeschlagen ist, wenn ich die Bezeichnung im Identitätsinspektor auswähle.
jbehrens94
1
@EricQian Ich überschreibe auch die Methode override init (frame: CGRect) und die erforderliche Methode init? (Codierer aDecoder: NSCoder). Habe immer noch den gleichen Fehler.
Raj Aggrawal

Antworten:

118

Für den Xcode Interface Builder müssen Sie beide oder keine Initialisierer implementieren, damit @IBDesignableKlassen in IB ordnungsgemäß gerendert werden können.

Wenn Sie implementieren, müssen required init(coder aDecoder: NSCoder)Sie ebenfalls überschreiben init(frame: CGRect), andernfalls stürzt "der Agent ab", wie aus den von Xcode ausgelösten Fehlern hervorgeht.

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

override init(frame: CGRect) {
    super.init(frame: frame)
}
Mathielo
quelle
12
Ich glaube nicht, dass das der Grund ist. Ich habe beide Methoden, ich bin auf 7.2. Es stürzt immer noch ab.
Alix
1
Dies war der Grund für mich, ich habe das entfernt, init(frame: CGRect)weil ich es nur von einem Storyboard aus initialisiert habe.
Kyle Goslan
2
@mathielo Ich überschreibe auch die Methode override init (frame: CGRect) und die erforderliche Methode init? (Codierer aDecoder: NSCoder). Immer noch den gleichen Fehler
Raj Aggrawal
1
Es stellte sich für mich als sehr schwierige Debugging-Herausforderung heraus. Ich habe eine Klasse untergeordnet, die in einem anderen Framework (Pod) vorhanden war. Die übergeordnete Klasse hatte eine der init-Methoden ohne den öffentlichen Bereich (Standard ist intern). Daher war die init-Methode in meiner Quelle nicht sichtbar. Schließlich habe ich das herausgefunden und eine Kopie der übergeordneten Klasse in der Quelle meines Projekts erstellt. Danke vielmals!
KK
1
Diese beiden Init können nicht genug sein. Nehmen Sie als Beispiel UISegmentedControl, Sie sollten auch override init implementieren (Elemente: [Any]?) .
Bagusflyer
23

Ich habe das gleiche Problem getroffen und es folgendermaßen 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.

debuggen

  1. Dann sagt Ihnen der Xcode, wo sich das Prolem befindet. In meinem Fall lasse ich das IBDesignablevor dem Unterricht fallen.

  2. Dann säubere ich es und baue es wieder auf, der Fehler ist verschwunden

Azure Yu
quelle
Hallo @Azure, ich stehe auch dafür vor dem Problem. Xcode (7.3) bewegt mich nicht in die Codezeile, was das Problem verursacht, wenn ich auf die Schaltfläche Debuggen klicke, wie Sie auf dem hinzugefügten Bild gut gezeigt haben. Ist das ein Fehler von Xcode?
Sauvik Dolui
Hi ~ Hast du dein Problem jetzt gelöst? Ich benutze auch Xcode (7.3). Stellen Sie sicher, dass Sie die Ansicht auswählen, die zum Absturz führt, und klicken Sie auf die Schaltfläche Debuggen.
Azure Yu
2
Vergessen Sie nicht , einen Haltepunkt "Alle Ausnahmen" zu erstellen, bevor Sie auf die Schaltfläche "Debuggen" klicken. Auf diese Weise stoppt der Debugger nach dem Absturz entweder einige Anweisungen, bei denen Sie einfach auf Ihren Code in der Stack-Trace-Liste klicken können, oder direkt am Anweisung, die den Absturz verursacht.
Carlos_ms
11

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

Ich habe gerade ein Problem mit einem designierbaren Drittanbieter behoben, der Probleme mit der valueForKeySemantik hatte.

voidref
quelle
11

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

  1. Löschen Sie von Xcode abgeleitete Daten für das Projekt. Sie befinden sich in ~ / Library / Developer / Xcode / DerivedData
  2. Bereinigen Sie Ihren aktuellen Build, indem Sie ⌘⇧K drücken
  3. Erstellen Sie Ihr Projekt
  4. Gehen Sie im Storyboard zum Menü "Editor" und führen Sie "Alle Ansichten aktualisieren" aus. Warten Sie, bis der Build abgeschlossen ist und die Fehler behoben sind

Ich musste nicht den vierten Schritt ausführen, um das Problem zu lösen (und mein PaintCode-drawRect'd UIView in das Storyboard malen zu lassen), das hier nur für den Fall enthalten ist.

Gutschrift an @Mojtaba und @WeZZard

Glenn Barnett
quelle
11

Für mich war es nicht das, #if !TARGET_INTERFACE_BUILDERwas mich dazu brachte. Grundsätzlich hatte ich Code, der zum Zugriff auf einen Pfad in meinem Bundle führen würde ...

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

Das Problem ist, dass beim Ausführen in IB (und nicht in Ihrer App) Bundle.mainnicht Ihre App ...

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

Die Antwort darauf besteht einfach darin, Ihren @IBDesignable UIViewCode sorgfältig zu überprüfen und #if !TARGET_INTERFACE_BUILDERfür alles zu verwenden (in meinem Fall zum CoreLocationBeispiel für Aufrufe ), das zur Ausführung zur Entwurfszeit keinen Sinn ergibt.

Wie ich das debuggt und gefunden habe

Folgendes sehen Sie, wenn Sie das verwenden, Editor -> Debug Selected Viewwährend Sie @IBDesignable UIViewin Ihrem Storyboard auswählen :

Dies wird angezeigt, wenn Sie den <code> Editor -> Ausgewählte Ansicht debuggen </ code> verwenden, während Sie Ihren <code> @IBDesignable UIView </ code> in Ihrem Storyboard auswählen

Sie werden dann an der richtigen Stelle abstürzen

Der Debug Navigator

Wie Sie sehen, initXXXXwurde in meinem Fall ein ausgeführt assert, der zur Entwurfszeit abstürzte, weil zur Entwurfszeit nach einem Wert in der Datei in meinem Bundle gesucht wurde - Xcode.

StuFF mc
quelle
Was ist der Sinn der Verwendung von @IBDesignable, wenn wir> #if !TARGET_INTERFACE_BUILDER
Yash Bedi
8

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

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

Die Lösung besteht darin, diese init-Methode von UIImage zu verwenden:

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

Arbeitscodebeispiel:

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

Adrien Yvon
quelle
7

XCode 10, Swift 4.2

Ich habe hier eine Antwort gefunden

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

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

musste geändert werden auf

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
entkommen kanadisch
quelle
2

So löse ich dieses Problem:

  • Stellen Sie sicher, dass die Steckdosen ordnungsgemäß initialisiert sind
  • @IBInspectable-Eigenschaften würden ordnungsgemäß initialisiert
  • Klicken Sie in der XIB-Datei auf den Platzhalter des Dateieigentümers. Wechseln Sie zum Identitätsinspektor, und stellen Sie sicher, dass keine Standardwerte vorhanden sind

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

Verwendung:

Geben Sie hier die Bildbeschreibung ein

vikram jeet singh
quelle
2

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

Charmi
quelle
Dies scheint in einigen Fällen zu funktionieren. Ich hatte das gleiche Problem, versuchte alle möglichen Dinge, die das Problem nicht beheben konnten, und schließlich schloss ich den xcode vollständig und öffnete ein anderes Projekt, das kein @IBDesignable implementierte, und öffnete das Projekt, auf dem der Agent abstürzte und das Fehlermeldungen sind weg. Ich habe keine gültige Logik dahinter, aber es scheint, dass Xcode ein Moor hat :(
Dip
1

Ich habe einen ganzen Tag damit verschwendet und endlich mein Problem gelöst Geben Sie hier die Bildbeschreibung ein

Ich habe Build für Ziel als 8.0 ausgewählt und es behebt alles für mich.

Sam
quelle