webentwicklung-frage-antwort-db.com.de

IB Designables: Fehler beim Rendern und Aktualisieren des Status des automatischen Layouts

Ich habe eine benutzerdefinierte Ansicht (xib), in der eine UIButton enthalten ist. Ich habe id IBDesignable folgendermaßen erstellt:

UserView.Swift

import UIKit

@IBDesignable
class UserView: UIView {

    @IBOutlet var view: UIView!
    @IBOutlet weak var userButton: UIButton!

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

    }

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

    fileprivate func load() {
        Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
        addSubview(view)
        self.frame = bounds
    }

}

UserView.xib

  • UIButton hinzugefügt und Einschränkungen festgelegt
  • Legen Sie den Besitzer der Datei fest: UserView 

Storyboard

Ich habe eine UIView zu einem Bar Button Item hinzugefügt und der UserView-Klasse zugewiesen, aber es wird nichts gerendert, und ich habe den folgenden Build-Fehler erhalten:

fehler: IB Designables: Fehler beim Rendern und Aktualisieren des Status des automatischen Layouts für FoodViewController (bR3-Kz-wX7): Der Agent hat eine Ausnahme ausgelöst.

Meine derzeitige Umgebung: Xcode 9 , Swift 4

16

Ich füge dieses Skript am Ende meiner Podfile hinzu und führe erneut pod install aus. So konnte ich normalerweise mein Projekt bauen.

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

Ich hatte gerade das gleiche Problem und das einzige, was für mich funktionierte, war, anstatt das Hauptbündel zu verwenden, das ich brauchte, um das Bündel für die Nib zu bekommen, die ich wollte. Im Wesentlichen ändern:

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

Zu:

let bundle = Bundle(for: UserView.self)
bundle.loadNibNamed("UserView", owner: self, options: nil)

Was seltsam ist, da in meinem Fall die beiden Bundles zur Laufzeit in LLDB verglichen wurden, waren sie identisch (Klassenname ist unterschiedlich, aber der Rest meines Setups war identisch mit dem OP).

 lldb screenshot

14
Mike Velu

Diese Frage hängt mit dieser Antwort zusammen. Überprüfen Sie beide.
Instanz von ClassName konnte nicht gerendert werden: Der Agent hat eine Ausnahmelade in Bundle geworfen

Endeffekt

Stellen Sie sicher, dass Ihre Xib-Datei keine verwaisten Ausgänge hat. Überprüfen Sie jede Ansicht/jedes Element der Spitze auf einen Auslass, und entfernen Sie sie und fügen Sie sie erneut hinzu.

 A nib subview with an outlet

Für mich waren sie verwaiste Verkaufsstellen. Es scheint, dass die Schreibfedern und IB sehr wählerisch sind und der Debugger nicht viele Details angibt. Wenn dies nicht funktioniert, beginnen Sie vielleicht mit einer neuen Schreibfedern-Datei.


Komplettlösung meines Arbeitscodes

Es dauerte mehrere Tage, bis das Problem gelöst wurde. Zum Nutzen anderer erteile ich eine ausführliche Antwort und zeige alle relevanten Codes und Verbindungen.

Ein Working Commit, bei dem ich die Fix-Aktion (oben) implementiert habe, ist hier: https://github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Xcode-Version 9.2

Meine Dateistruktur

Hier ist meine Dateistruktur (Hinweis: Ich erstelle einen Pod mit Cocoapoden namens ZMAppFoundation. Außerdem ist ZMPieTimerView.Swift für die Lösung nicht relevant.):

 enter image description here

Ich möchte, dass meine Spitze in der Main.storyboard-Datei angezeigt werden kann (IBDesignable). Hier ist der Besitzer und die benutzerdefinierte Klasse meiner Xib, ZMGauge.xib:

 File's Owner  Custom Class

Code, Implementierungen

Hier ist meine ZMXibView-Klasse:

//  Adapted from https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d

import UIKit

@IBDesignable
open class ZMXibView: UIView {


    var contentView:UIView?
    @IBInspectable var nibName:String?

    override open func awakeFromNib() {
        super.awakeFromNib()
        xibSetup()
    }

    func xibSetup() {
        guard let view = loadViewFromNib() else { return }
        view.frame = bounds
        view.autoresizingMask =
            [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        guard let nibName = nibName else { return nil }
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(
            withOwner: self,
            options: nil).first as? UIView
    }

    override open func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        xibSetup()
        contentView?.prepareForInterfaceBuilder()
    }
}

Im Storyboard ist mein Xib in der benutzerdefinierten Klasse festgelegt. Ich benutze Cocoapoden, um eine Hülse zu entwickeln. Ich habe das Modul explizit ausgewählt. (Beachten Sie, dass ich in meiner XibView-Klasse die nibName-Eigenschaft definieren muss.):

 Setting custom class on the xib

Vergiss nicht!

Dann müssen Sie möglicherweise Xcode bereinigen, schließen, neu erstellen oder einfach warten, bis der IB es erneut rendert. Es ist immer noch ein Rätsel für mich, wann genau Xcode die IBDesignables rendern will, und ich weiß nicht, wie man es erzwingen kann.

Erfolg

Basierend auf meinem Code und den Aktionen, die ich unternommen habe, kann meine Spitze jetzt in meinem Main.storyboard angezeigt werden.

 nib is viewable now

Falls Du es verpasst hast

Falls Sie es verpasst haben, steht meine Lösung ganz oben in diesem Beitrag. Ich habe es geschafft, den vom OP zitierten Fehler durch Entfernen einiger verwaister IBOutlets zu löschen.

4
Jacob Davis

Xcode 9.3, CocoaPods 1.5.3 Möglicherweise wurde die Version CocoaPods kürzlich aktualisiert. Ausgabe hier .

Ich hatte diesen Fehler IB Designables: Failed to render and update auto layout status im Storyboard, die Klasse STPPaymentCardTextField in Stripe SDK, die sich auf Cocoapods bezieht.

Lösung ist ein Downgrade Ihrer CocoaPods auf 1.4.0.

Sudo gem list cocoapods

Sudo gem uninstall cocoapods

Sudo gem install cocoapods -v 1.4.0

pod update
4
Cons Bulaquena

Für mich bestand der Fix darauf, dass Interface Builder das Objekt neu zeichnete. Ich hatte dies an zwei Stellen und beide wurden durch keine Codeänderungen behoben, aber die Symptome des Agentenfehlers und die leeren Ansichten im Storyboard wurden behoben.

Ein Problem wurde behoben, indem eine UIView in eine andere Reihenfolge unter der Ansicht gezogen und neu erstellt wurde. Eine zweite in einer TableView mit Prototyp-Zelle wurde behoben, indem die TableView ausgewählt, die Anzahl der Prototyp-Zellen in zwei geändert wurde, eine Sekunde gewartet und dann wieder auf eine geändert wurde. Die TableView, die eine weiße Leerstelle war, zeichnete dann alle Elemente korrekt und der Agentenfehler war verschwunden.

Es fühlt sich an, als wäre es ein Fehler bei IB und bei anderen Suchen gibt es viele Lösungen für den ähnlichen Fehler. Hoffe das hilft jemandem.

2
FiveOhHO

(xCode 9.2, Swift 4) Die folgenden Informationen helfen Ihrem genauem Problem möglicherweise nicht, können jedoch anderen mit einem sehr ähnlichen Problem helfen. Das war mein Fehler: 

fehler: IB Designables: Fehler beim Rendern und Aktualisieren des Status des automatischen Layouts für CustomExampleView (XXXXX): Der Agent ist abgestürzt

Ich konnte den Fehler beim Löschen von CustomExampleView.xib und CustomExampleView.Swift entfernen. Um zu replizieren, habe ich die Dateien neu erstellt, ging zur .xib und stellte die benutzerdefinierte Klasse der obersten Ebene auf CustomExampleView ein.

Mein Fehler stellte die benutzerdefinierte Klasse auf die oberste Ansicht in der .xib ein, anstatt die benutzerdefinierte Klasse auf Eigentümer der Datei zu setzen. Nachdem ich die richtige benutzerdefinierte Klasse eingestellt hatte, wurde mein Problem gelöst.

2
olearyj234

Es ist das Problem mit einigen Kakaopods-Versionen wie 1.5.0. Wenn Sie diesen Befehl verwenden, führt dies zum Rendern von fehlgeschlagenen Um von der aktuellen Version zu einem anderen zu wechseln, führen Sie diesen Befehl im Terminal aus

Sudo gem uninstall cocoapods

Sie können jede bestimmte Version installieren, indem Sie so erwähnen 

Sudo gem install cocoapods -v 1.4.0

Ich hoffe es funktioniert für Sie.

1
Shaheryar Malik

Für mich wurde dieses Problem gelöst durch

  1. Aktualisieren von Pods.
  2. Ändern der Build-Einstellung in "$ (vererbt)" für eingebettete Swift-Bibliotheken
  3. Bauen, Reinigen, Bauen.
  4. Projekt abschließen.
  5. Xcode beenden.
  6. Läuft wieder.

hahaha alter hack :) Danke!

1
Najam
    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

Durch Eingabe des oben genannten Codes in die Pod-Datei werden die Probleme gelöst. Dieser Code erübrigt lediglich die Anforderung der Codesignierung für das installierte Framework über Cocoapods. Dies scheint jedoch auch ein Fehler in IBDesignable zu sein, da Xcode 10-Wetten verwendet werden. 4 Ich bekomme diesen Fehler nicht, weil in Xcode 10 ein neues Build-System eingebaut ist.

1
Nikhil Pandey

Ich weiß nicht wirklich viel über die Ursache davon, aber ich habe dies ein paar Mal gesehen und jedes Mal wird es durch Neustarten von xcode behoben. Ich denke, da sollte jeder anfangen, und wenn das nicht funktioniert, können Sie die anderen vorgeschlagenen Antworten ausprobieren.

0

Leider können Sie IBOutlets nicht in einem IBDesignable verwenden. Bessere Antwort für Sie hier:

Live-Render IBOutlet-verbundene Subviews über IBInspectable-Eigenschaften

Vielleicht wollten Sie, dass Ihre UserView nicht UIView, sondern UIButton erweitert?

0
Mars

Ich mache mir Sorgen, wie dumm das ist, wenn das, was ich Ihnen jetzt sagen werde, einen Unterschied macht, aber Sie können versuchen, den fehlerhaften Code zu entfernen 

override func prepareForInterfaceBuilder() {

und verwende es nur in 

override func awakeFromNib() {

. Ich schrecke noch mehr, wenn ich berichte, dass es möglich ist, dass sich Ihre Änderungen im Storyboard dennoch wie gewünscht widerspiegeln. 

Sie können den Unterbrechungscode identifizieren, indem Sie alle Zeilen auskommentieren und die Unterbrechungslinie mithilfe eines Ausschlussprozesses identifizieren. 

0
ScottyBlades