Xcode 8 - IB Designables - Fehler beim Rendern und Aktualisieren des Status des automatischen Layouts. Der Agent ist abgestürzt


167

Ich habe kürzlich ein Upgrade auf Xcode 8 durchgeführt und habe Probleme mit dem Storyboard.

Wenn ich das Projekt öffne und das Storyboard nicht geöffnet habe, wird es kompiliert und einwandfrei ausgeführt. Sobald ich das Storyboard öffne, erhalte ich mehrere Fehler über IB Designables, wie unten gezeigt.

Geben Sie hier die Bildbeschreibung ein

Diese Ansichten sind die einzigen Ansichten, die benutzerdefinierte Ansichten von verwenden TextFieldEffectsund BEMCheckboxdie ich mit Cocoapods importiert habe.


Überprüfen Sie möglicherweise das Repository für den Pod, den Sie verwenden, und prüfen Sie, ob dieses Problem bei anderen Benutzern häufig auftritt.
Zolnoor

Irgendeine relevante Antwort darauf?
Mohsin Khubaib Ahmed

1
habt ihr eine Problemumgehung gefunden?
Dip

Achtung, das Problem kann sein, dass Sie ein Fettgebäude für eine eingebettete Bibliothek benötigen . In meinem Beispiel hatte ich Swifter eingebettet. Natürlich haben Sie einen fetten Build (für die Entwicklung - Simulator / Telefon) und einen Nur-Telefon-Build (nur für den App Store, nur Telefon) zur Hand und wechseln bei Bedarf einfach zum Nur-Telefon, um ihn bei TestFlight usw. einzureichen hatte die reine Telefonbibliothek im Projekt !!!!! Doh! Das Wechseln zum "richtigen" Fett hat das Problem behoben.
Fattie

Antworten:


179

Sie können eine der folgenden Möglichkeiten ausprobieren, um die Ursache herauszufinden:

  1. Suchen Sie nach den IBDesignablesAgentCocoaTouchProtokollen in diesem Verzeichnis: ~/Library/Logs/DiagnosticReportsund ermitteln Sie die Ursache.

Hinweis: Für Benutzer mit Catalina: suchen IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Gehen Sie zum Editor -> Ausgewählte Ansicht debuggen, während Sie Ihre @IBDesignable UIViewin Ihrem Storyboard auswählen , und sehen Sie sich die Stapelverfolgung an.

  2. Ordner "Daten ableiten" löschen.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
  3. Bereinigen Sie Ihr Projekt Shift + Command + Alt + K .

  4. Erstellen Sie Ihr Projekt Command + B .


35
Mit diesem Ansatz konnte ich herausfinden, dass der Grund war Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Ich wusste nicht, dass IBDesignablesAgentCocoaTouchProzessaufrufe init(frame:)statt init?(coder aDecoder:).
Yevhen Dubinin

5
@ YevhenDubinin Danke, das hat mir geholfen. Alles war in Ordnung, nachdem ich init(frame:)in meiner UIButton-Unterklasse
Doraemon

2
Dies hat mein Problem behoben, aber ich musste xCode beenden, bevor ich abgeleitete Daten löschte
Husam

2
Die beste Antwort init (Rahmen :) ist ein häufiges Problem
Michał Ziobro

1
Beenden Sie xcode und löschen Sie DerivedData. Es hat das Problem gelöst.
Mubashar

80

Ich habe das Problem folgendermaßen gelöst:

  1. Gehe zu File > Workspace settings.
  2. Klicken Sie auf den kleinen Rechtspfeil neben "Abgeleitete Daten". Dadurch wird die Finder-App am Speicherort des DerivedDataOrdners geöffnet .
  3. Gehen Sie in den DerivedDataOrdner und löschen Sie den Ordner, der Ihrem Projekt entspricht.
  4. Beenden Sie Xcode und öffnen Sie es erneut.
  5. Reinigen Sie Ihr Projekt shiftcommandk.
  6. Bauen Sie Ihr Projekt commandb.
  7. Öffne dein Storyboard.
  8. Gehe zu Editor > Refresh all views.

Aktualisiert

Manchmal einfach direkt zur Editor > Refresh all viewsArbeit gehen. Wenn Refresh all viewsdeaktiviert, beenden Sie Xcode und versuchen Sie es erneut.


Vielen Dank für die Veröffentlichung. Ich habe eine "alte Schule" über die Befehlszeile gelöscht, um abgeleitete Daten zu löschen, aber das Problem blieb bestehen. Mit Ihrer Methode wurde das Problem für mich gelöst.
Adrian

Aktualisieren Sie auch für mich alle Ansichten für den Gewinn. Vielen Dank!
Mike K.

56

Ich lösche einfach die Ansicht, die fehlgeschlagen ist, und drücke Befehl + Z, um das Löschen rückgängig zu machen. Für mich geht das.

Wenn Sie die fehlgeschlagene Ansicht später bearbeiten, kann der Fehler erneut auftreten. Führen Sie die obigen Schritte erneut aus.


6
Es ist lächerlich, aber es hat funktioniert.
Ansari

1
Genial!! Arbeitete für mich
Nupur Sharma

1
Wer weiß, dass es die Antwort sein könnte. Es hat funktioniert, ich kann es immer noch nicht glauben
Asad Amodi

37

Ich habe dieses Problem in CocoaPod 1.5.0 festgestellt. Die Lösung besteht darin, den Pod erneut zu installieren (Pod-Installation erneut), sobald dieser Fehler angezeigt wird, oder Sie können stattdessen CocoaPod 1.4.0 verwenden. Es funktioniert gut in 1.4.0 (zumindest für mich.)

aktualisieren:

Fügen Sie das folgende Skript in Podfile hinzu, um das Problem in 1.5.0 zu lösen

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

Referenz: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


100% wahr. Ein Downgrade auf 1.4.0 hat das Problem für mich behoben.
Ale_stro

4
Arbeitete, 1.5.0 Hülsen.
Andrey Oshev

3
es s work for me, you should add endet bis zum letzten Code.
Mahdi

1
Hat auch für mich gearbeitet. Versuchte alle anderen Vorschläge ohne Erfolg. Getestet mit Pods 1.3.1
Sal

18

Das Hinzufügen des folgenden Codes zu meiner @IBDesignableKlasse hat den Trick getan.

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

Das funktioniert bei mir. Tatsächlich habe ich zwei Overrides zum Erweitern hinzugefügt UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Dann neu erstellen und Warnung (Fehler) weg. Sie müssen nicht einmal den Build-Ordner bereinigen.
John Pang

Vielen Dank! Gute Antwort)
JiosDev

13

Für alle, die diese IBDesignablesAgentCocoaTouchDatei nicht finden können oder beim Versuch, ausgewählte Ansichten im Editor zu debuggen, eine Fehlermeldung angezeigt wird, gibt es eine andere Möglichkeit, die Fehler "Fehler beim Rendern" zu debuggen.

Öffnen Sie die 'Console'-App, wählen Sie in der Seitenleiste Ihren aktuellen Mac aus (dieser wird wahrscheinlich standardmäßig automatisch ausgewählt) und suchen Sie dann in der Suchleiste nach "IBSceneUpdate" und drücken Sie die Eingabetaste.

Auf diese Weise erhalten Sie jedes Mal einen Xcode-Fehler für eine IBDesignable nicht rendern können, einen neuen Eintrag "IBSceneUpdate" mit weiteren Details zum Fehler.

So konnte ich zumindest meine IBDesignableFehler debuggen !

Konsolen-App mit IBSceneUpdate-Fehlern


1
Die App ist eher eine Konsole als ein Terminal, nur zu Ihrer Information.
Carl Upton

Guter Fang! Ich habe meine Antwort bearbeitet.
Stelabouras

11

Wenn Sie eine xib-Datei für eine benutzerdefinierte Ansicht verwenden. Versuche dies:

Wechsel von

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

Zu:

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

8

Versuchen Sie, "Merkmalsvariationen verwenden" (Bereich "Identität und Typ") für alle XIB-Dateien zu deaktivieren, die Sie möglicherweise für benutzerdefinierte Ansichten haben, die in Ihrem Storyboard verwendet werden.


7

Mein Problem wurde gelöst, indem Ordner (die mit diesem Projekt zusammenhängen) aus abgeleiteten Datenordnern gelöscht wurden. Klicken Sie dazu auf Datei -> Projekteinstellung -> und dann auf das Pfeilzeichen neben /Users/.../Xcode/DerivedData. Klicken Sie auf DerivedData-Ordner. Sie werden sehen, dass Ihr Projekt mit dem Namen Ordner diese löscht. Beenden Sie xcode, um Ihr Projekt zu öffnen. Bereinigen Sie das Projekt mit diesem Schritt. Produkt-> Bereinigen und erstellen Sie das Projekt: Produkt-> Erstellen Diese Probleme werden behoben.


4

Richtige Antwort von @Maria :

Überprüfen Sie den Absturzbericht unter ~/Library/Logs/DiagnosticReports

Alternativer Weg :

  1. öffnen Spotlight

Geben Sie hier die Bildbeschreibung ein

  1. Art console.app

Geben Sie hier die Bildbeschreibung ein

  1. wählen Crash reports

Geben Sie hier die Bildbeschreibung ein

  1. Überprüfen Sie eines auf IBDesignablesAgent-iOSund überprüfen Sie das Absturzprotokoll

Die Verwendung der Konsole hat mir geholfen, mein Problem zu lösen. Viel detailliertere Nachrichten als in Xcode.
Andrew Moore

3

Öffnen Sie einfach Ihr Storyboard -> Editor -> Alle Ansichten aktualisieren. Diese Arbeit für mich.


3

Ich habe versucht, das Projekt zu bereinigen und auszuführen, um dieses Problem nicht zu lösen.

Aber das Projekt wurde geschlossen und wieder geöffnet .


2

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

1
Könnten Sie näher erläutern, wie dies das Problem tatsächlich löst?
Paula Hasstenteufel

Dies löste das Problem, aber ich weiß immer noch nicht, warum ich nicht benutze, dass use_frameworks, weil das für ein schnelles Projekt richtig ist
Abhishek

Mein Podfile verwendet bereits Frameworks. Gibt es Vorschläge, die nicht kommentiert wurden?
mmr118

@ moni15 Ich habe eine weitere mögliche Lösung hinzugefügt. Bitte prüfen.
Ashish Pisey

Das Kommentieren von #use_frameworks in der Pod-Datei und das Löschen der DerivedData hat bei mir funktioniert.
Jugal Desai

2

Ich hatte das gleiche Problem und kam hierher, um herauszufinden, was passiert ist. Ich bemerkte die am besten bewertete Antwort und die Antwort selbst half mir nicht, da IBDesignable nicht im Protokollordner vorhanden war und ich dort bereits alle anderen Optionen ausprobiert hatte. In den Kommentaren bemerkte ich jedoch, dass jemand über eine Frame-Init sprach.

Ich habe mich entschlossen, meine IBDesignable-Erweiterung für UIView zu kommentieren, und das Problem wurde sofort behoben. Um dies zu beheben, suchen Sie die Erweiterung, die das Problem verursacht, und stellen Sie sicher, dass Sie die erforderlichen Inits einrichten, indem Sie eine IBDesignable-Klasse erstellen und die erforderlichen Initialisierer wie folgt bereitstellen:

@IBDesignable class RoundedView: UIView {

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

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

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

WICHTIG: Denken Sie daran, die neue Klasse zu dem Element hinzuzufügen, für das Sie das Designable verwenden.


1
Vergessen Sie nicht, in der Implementierung von prepareForInterfaceBuilder () super.prepareForInterfaceBuilder () aufzurufen.
Jaime S

1

Gleicher Fehler: Hatte UITextField angepasst und den Interface Builder verwendet, war der Fehler in der Konsole -Verwendung des nicht implementierten Initialisierers 'init (frame :)' für die Klasse "CustomField"

Der Initialisierer wurde hinzugefügt, um den Fehler zu beheben


1

Ich hatte dieses Problem nach dem Update auf die neueste XCode-Version. Nachdem ich mehrere oben beschriebene Lösungen ausprobiert hatte, habe ich nur ganz Xcode und dann das System heruntergefahren und es eingeschaltet und das hat bei mir funktioniert.


0

Nachdem Sie die erforderlichen Änderungen vorgenommen haben, ändern Sie das Storyboard oder in meinem Fall eine .xib, um sie in "XCode 7" zu öffnen, zu speichern und zu schließen. Dies ist nur eine Stop-Gap-Maßnahme, um die Fehler zu beheben. Letztendlich müssen Sie sie jedoch beheben oder tun, bis Sie nicht mehr dazu in der Lage sind.


0

In meinem Fall habe ich eine Bibliothek verwendet, die in Unterklassen unterteilt war UIView. Es wurde verwendet IB_DESIGNABLEund es fehlte der Anruf an[super awakeFromNib] . Nachdem ich den Aufruf zu dieser Methode hinzugefügt habe, ist der Fehler behoben.

Ich bin mir nicht sicher, ob die Tatsache, dass es implementiert wurde, IB_DESIGNABLEeinen Einfluss darauf hatte.


Wo haben Sie den Code für [super awakeFromNib] hinzugefügt? Können Sie Ihren Code teilen?
TheJeff

0

Dies ist für mich der einfachste Weg: Fügen Sie dieses Skript zu Ihrem hinzu Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

Quelle:

Diese Problemumgehung für @IBDesignable finden Sie hier: https://github.com/CocoaPods/CocoaPods/issues/5334

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.