webentwicklung-frage-antwort-db.com.de

Festlegen der benutzerdefinierten inspizierten Eigenschaft (cornerRadius) für (UIView)

Einzelheiten

Ich habe mir das Video von Session 411 auf WWDC 2014 angesehen unter Bezugnahme auf " Was ist neu in Interface Builder ", und ich habe versucht, Frameworks zu erstellen, um @IBDesignable-Klassen zu erstellen, um eine Vorschau meiner Änderungen im Storyboard anzuzeigen ohne die Anwendung ausführen zu müssen.

Die @IBInspectable-Eigenschaften werden korrekt angezeigt, wenn ich meine Klasse einer bestimmten Ansicht hinzufüge, und die Ansicht mit dem folgenden Code korrekt wiedergeben:

Code

@IBDesignable
class MyView: UIView {
    @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
        didSet {
            layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

    @IBInspectable var masksToBounds: Bool = false {
        didSet {
            layer.masksToBounds = masksToBounds
        }
    }
}

Log

Ich habe festgestellt, dass diese Attribute unter Benutzerdefinierte Laufzeitattribute (Under Identity Inspector ) hinzugefügt wurden. Was ich jetzt davon erwarte, ist, wenn ich den Code ausführte, um diese Änderungen in einer bestimmten Ansicht zu behalten.

Ich führe die Anwendung aus und die Ansicht lädt nicht die User Defined Runtime-Attribute , und gibt diesen Fehler bei der Ausgabe (nicht abstürzen) aus:

Unknown class MyClass in Interface Builder file
Failed to set (cornerRadius) user defined inspected property on (UIView)

Frage

Was bewirkt, dass die Anwendung Benutzerdefinierte Laufzeitattribute die ich unter Identity Inspector hinzugefügt habe?

28
EridB

Der Code ist korrekt.
Wenn Sie einen @ IBDesignable deklarieren, werden alle @IBInspectable-Eigenschaften als benutzerdefinierte Laufzeitattribute für den Interface Builder verfügbar gemacht. 

Das Problem

Unbekannte Klasse MyClass in der Interface Builder-Datei

Das bedeutet, dass der Interface Builder keine Klasse finden konnte. Sie haben ein falsches class festgelegt, das in Ihrer App nicht vorhanden ist.
Ihre customView-Klasse ist MyView, aber im Interface Builder steht MyClass

enter image description here

Lösung zu beheben

  • Richten Sie in Interface Builder die richtige Klasse ein, in Ihrem Fall MyView
  • Überprüfen Sie den Status von Designable. Es sollte Up to date sein, wenn es nicht etwas ist, was nicht stimmt. 

enter image description here

Auch Wenn Sie sich entschieden haben, den Kunden Designable zu entfernen, sollten Sie dies tun

  • Benutzerdefinierte Klasse entfernen
  • Benutzerdefinierte Laufzeitattribute entfernen

enter image description here

40

Aufgrund des Fragetitels könnten einige Leute mit einem etwas anderen Problem hierher kommen (wie ich). Wenn du

  • fügte ein @IBInspectible hinzu 
  • und löschte es dann im Code

Dann erhalten Sie möglicherweise einen ähnlichen Fehler 

Fehler beim Festlegen (xxx) der benutzerdefinierten überprüften Eigenschaft in [Ihre benutzerdefinierte Ansicht] ...: Diese Klasse entspricht nicht der Schlüsselwertcodierung für den Schlüssel [xxx].

Die Lösung besteht darin, die alte Eigenschaft zu löschen.

 enter image description here

Öffnen Sie den Identitätsinspektor für Ihre Klasse, wählen Sie den Eigenschaftennamen unter Benutzerdefinierte Laufzeitattribute aus und drücken Sie die Minustaste (-).

Auch dies ist nicht die Antwort auf die Frage des OP, aber es könnte die Antwort auf das Problem eines anderen sein, der hierher kommt.

22
Suragch