Wenn ich meine eigene erweiterte UIButton
Klasse 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)
ios
xcode
swift
interface-builder
jbehrens94
quelle
quelle
init(frame: CGRect)
undAntworten:
Für den Xcode Interface Builder müssen Sie beide oder keine Initialisierer implementieren, damit
@IBDesignable
Klassen in IB ordnungsgemäß gerendert werden können.Wenn Sie implementieren, müssen
required init(coder aDecoder: NSCoder)
Sie ebenfalls überschreibeninit(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) }
quelle
init(frame: CGRect)
weil ich es nur von einem Storyboard aus initialisiert habe.Ich habe das gleiche Problem getroffen und es folgendermaßen gelöst:
Fehler: IB Designables: Fehler beim Aktualisieren des Status des automatischen Layouts: Der Agent ist abgestürzt
Dann sagt Ihnen der Xcode, wo sich das Prolem befindet. In meinem Fall lasse ich das
IBDesignable
vor dem Unterricht fallen.Dann säubere ich es und baue es wieder auf, der Fehler ist verschwunden
quelle
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 designierbaren Drittanbieter behoben, der Probleme mit der
valueForKey
Semantik hatte.quelle
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
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
quelle
Für mich war es nicht das,
#if !TARGET_INTERFACE_BUILDER
was 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.main
nicht 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 UIView
Code sorgfältig zu überprüfen und#if !TARGET_INTERFACE_BUILDER
für alles zu verwenden (in meinem Fall zumCoreLocation
Beispiel 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 View
während Sie@IBDesignable UIView
in Ihrem Storyboard auswählen :Sie werden dann an der richtigen Stelle abstürzen
Wie Sie sehen,
initXXXX
wurde in meinem Fall ein ausgeführtassert
, der zur Entwurfszeit abstürzte, weil zur Entwurfszeit nach einem Wert in der Datei in meinem Bundle gesucht wurde - Xcode.quelle
#if !TARGET_INTERFACE_BUILDER
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
quelle
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)
quelle
So löse ich dieses Problem:
Verwendung:
quelle
Öffnen Sie einfach einen Code auf einem anderen Xcode-Setup-System erneut. In meinem Fall hat es funktioniert.
quelle
Ich habe einen ganzen Tag damit verschwendet und endlich mein Problem gelöst
Ich habe Build für Ziel als 8.0 ausgewählt und es behebt alles für mich.
quelle