Ich habe den folgenden Code:
CustomView.h
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface CustomView : UIView
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@end
CustomView.m
#import "CustomView.h"
@implementation CustomView
- (void)setBorderColor:(UIColor *)borderColor {
_borderColor = borderColor;
self.layer.borderColor = borderColor.CGColor;
}
- (void)setBorderWidth:(CGFloat)borderWidth {
_borderWidth = borderWidth;
self.layer.borderWidth = borderWidth;
}
- (void)setCornerRadius:(CGFloat)cornerRadius {
_cornerRadius = cornerRadius;
self.layer.cornerRadius = cornerRadius;
}
@end
(Als Swift-Referenz trat dieses Problem auch beim Swift-Code auf.)
CustomView.swift
@IBDesignable
class CustomView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@IBInspectable var borderColor : UIColor = UIColor.clearColor() {
didSet {
self.layer.borderColor = borderColor.CGColor
}
}
@IBInspectable var borderWidth : CGFloat = 0.0 {
didSet {
self.layer.borderWidth = borderWidth
}
}
@IBInspectable var cornerRadius : CGFloat = 0.0 {
didSet {
self.layer.cornerRadius = cornerRadius
}
}
}
Ich UIView
habe einem View Controller im Storyboard ein hinzugefügt und seine Unterklasse auf gesetzt CustomView
.
Dies fügt die Zeile "Designables" hinzu. Es bleibt bei "Aktualisieren" hängen und der Tooltip sagt "Warten auf das Erstellen des Ziels". Es ändert sich nie von diesem Status.
Wenn ich zu den Attributprüfungen wechsle, kann ich folgende IBInspectable
Eigenschaften festlegen :
Und einmal eingestellt, werden sie auch in den "Benutzerdefinierten Laufzeitattributen" angezeigt:
Der Status "Designables" geht jedoch nie über "Aktualisieren" mit immer noch demselben Tooltip hinaus (ich habe mehrmals versucht, Cmd + B zu erstellen, es ändert sich nichts).
Außerdem IBInspectable
erhalte ich beim Festlegen der Eigenschaften für jede eine Warnung:
IBDesignables - Benutzerdefiniertes Laufzeitattribut für den Schlüsselpfad "borderColor" in der Instanz von "UIView" wird ignoriert ... diese Klasse ist für den Schlüssel borderColor nicht mit der Schlüsselwertcodierung kompatibel.
Screenshot der generierten Warnungen:
Ich bin mit den Schlüsselwert-Codierungs-kompatiblen Problemen vertraut und weiß im Allgemeinen, wie man sie löst ... aber ich verstehe nicht, wie man dieses Problem hier löst. Laut dem Identitätsinspektor der Ansicht ist die Ansicht eine "CustomView" (keine reguläre "UIView", die diese Eigenschaften nicht hat). Und wenn die Ansicht keine "benutzerdefinierte Ansicht" wäre, würden diese gestaltbaren Eigenschaften nicht im Attributinspektor angezeigt, oder? Wenn Interface Builder jedoch versucht, diese Attribute auf die Ansicht anzuwenden, wird wieder angenommen, dass die Klasse der Ansicht "UIView" ist und die Attribute nicht anwenden kann.
Irgendeine Hilfe? Bitte lassen Sie mich wissen, wenn ich einige wichtige Details ausgelassen habe, aber für das, was es wert ist, habe ich dieses Tutorial genau befolgt (außer ObjC vs Swift). Es ist auch erwähnenswert, dass ich dieses Tutorial genau auf einem anderen Computer befolgt habe und es wie ein Zauber funktioniert hat (ich wollte diesen Beitrag gestern Abend machen, aber der Computer, auf dem ich damals war, hatte dieses Problem nicht).
Basierend auf Kommentaren wurde vorgeschlagen, dass die .m
Datei möglicherweise nicht enthalten ist und dies das Problem verursachen könnte. Ich dachte sicherlich, ich hätte mir alle Mühe gegeben, dass dieses Szenario der Fall wäre, aber ich habe es trotzdem überprüft.
Als ich anfing, dies zu versuchen, hatte ich das Verständnis, dass die IB_DESIGNABLE
Klassen Teil eines anderen UIKit
Rahmens sein mussten. Auf diesem ersten Screenshot können Sie sehen, dass ich ein "CustomViews" -Framework eingerichtet habe, das eine Klasse hat CustomView
. Sie werden auch hier sehen, dass ich auch ein erstellt habe OtherView
, das identisch mit ist CustomView
, außer dass es nicht in einem separaten Framework ist. Das identische Problem besteht jedoch weiterhin im Storyboard zwischen beiden Klassen.
Hier haben wir einen Screenshot, der zeigt, dass er CustomView.m
mit dem CustomViews
Framework erstellt werden soll:
In der Zwischenzeit zeigt der folgende Screenshot verschiedene Dinge:
CustomViews.framework
ist angemessen im Hauptprojekt enthalten.OtherView.m
ist auch als Kompilierungsquelle enthalten. Selbst wenn etwas nicht stimmtCustomView
,OtherView
sollte es funktionieren, es werden jedoch identische Fehler generiert.Main.storyboard
undLaunchScreen.xib
werden rot angezeigt. Ich habe keine Ahnung warum und habe nicht die geringste Ahnung, warumLaunchScreen.xib
ich sollte (ich habe diese Datei nicht berührt), obwohl ich sagen kann, dass ich nach dem Betrachten anderer ProjekteMain.storyboard
auch in Rot für diese Projekte angezeigt werde, und das bin ich nichts mitIB_DESIGNABLE
oderIBInspectable
dort zu tun .
Ich habe es jetzt mehrmals versucht und wiederholt. Es funktioniert jedes Mal auf meinem Computer zu Hause - ich kann das in dieser Frage beschriebene Problem zu Hause nicht reproduzieren. Bei der Arbeit funktioniert es nie. Das in dieser Frage beschriebene Problem tritt jedes Mal auf.
Beide Computer sind Mac Minis, die dieses Jahr neu gekauft wurden (nicht die neuen Modelle, Modell Ende 2012). Auf beiden Computern wird OS X Yosemite 10.10 ausgeführt. Auf beiden Computern wird Xcode Version 6.1 ausgeführt. Zu Hause ist der Build (6A1052d). Heute Morgen kann ich bestätigen, dass auf beiden Computern identische Xcode-Builds ausgeführt werden.
Andere haben mir vorgeschlagen, dass es möglicherweise schlechtes RAM ist. Das scheint mir weit hergeholt. Ich habe das Projekt mehrmals neu gestartet und den Computer mehrmals neu gestartet. Mir scheint, wenn auf einem ungefähr 6 Monate alten Computer ein schlechter Arbeitsspeicher vorhanden wäre, würde ich andere Probleme sehen und dieses Problem wäre weniger konsistent. Dieses genaue Problem besteht jedoch weiterhin, obwohl das gesamte Projekt mehrmals von Grund auf neu gestartet und auf dem Computer vollständig neu gestartet wurde.
Wenn ich dieses Projekt kompiliere und ausführe, wird die benutzerdefinierte Ansicht mit den IBInspectable
Eigenschaften tatsächlich so angezeigt, wie ich es vom Storyboard erwartet habe. Ich stelle mir vor, dass dies auch ohne die Direktiven IB_DESIGNABLE
und der Fall wäre IBInspectable
, da diese als benutzerdefinierte Laufzeitattribute erstellt werden.
Antworten:
Aufgrund des Vorschlags von chrisco, die ausgewählte Ansicht zu debuggen (was ich bereits getan hatte, aber erneut versuchte), bemerkte ich einige andere Optionen am unteren Rand des Editor-Menüs.
Ich klickte auf "Alle Ansichten aktualisieren" und nachdem Xcode ein wenig nachgedacht hatte, zeigte das Storyboard plötzlich meine Ansicht wie erwartet an (wobei meine
IBInspectable
Eigenschaften ordnungsgemäß angewendet wurden ).Ich habe dann den gesamten Prozess erneut durchlaufen, um zu bestätigen, dass dies die Lösung ist.
Ich habe eine neue Klasse erstellt
ThirdView
. Diese Klasse ist wieder identisch mit den anderen. Ich habe die Klasse meiner Ansicht geändertThirdView
und diesmal etwas anderes bekommen:Klicken Sie auf "Anzeigen", um die Warnungen anzuzeigen:
Diesmal eine neue:
Dies ist nicht wirklich hilfreicher als das, was es bereits gab. Außerdem haben sich die anderen drei Warnungen jetzt seltsamerweise auf 6 verdoppelt.
Wenn ich im Dropdown-Menü des Editors erneut auf "Alle Ansichten aktualisieren" klicke, werden alle Fehler behoben und die Ansicht wird erneut ordnungsgemäß angezeigt.
Bis zu diesem Punkt war alles, was ich tat, etwas, mit dem ich zu Hause nie herumgespielt habe. Zu Hause hat es einfach funktioniert. Also habe ich "Ansichten automatisch aktualisieren" aktiviert und eine "Vierte Ansicht" zum Testen erstellt - wieder identisch mit den ersten drei.
Nachdem die Klasse der Ansicht in "FourthView" geändert wurde, sagte das Designables-Label für einen kurzen Moment "Aktualisieren" und schließlich "Aktualisieren":
Also habe ich meinen Computer zu Hause überprüft. "Ansichten automatisch aktualisieren" ist auf dem Computer aktiviert, der immer funktioniert hat. Es wurde am Computer ausgeschaltet, der es nicht war. Ich kann mich nicht erinnern, diese Menüoption berührt zu haben. Ich kann Ihnen nicht einmal sicher sagen, ob es vor Xcode 6 existiert hat. Aber diese Option hat den Unterschied gemacht.
TL; DR, wenn Sie das gleiche Problem haben, das in der Frage beschrieben wurde, stellen Sie sicher, dass "Ansichten automatisch aktualisieren" aktiviert ist (oder manuell "Alle Ansichten aktualisieren", wenn Sie ein Update in IB benötigen):
quelle
Ich habe einige weitere Details, die dazu führen können, dass Ihre IBDesignable-Klassen nicht geladen werden.
Wählen Sie Ihr problematisches Storyboard / xib aus, in dem Ihre benutzerdefinierten Ansichten angezeigt werden sollen.
Wechseln Sie im Navigatorbereich zum Berichtsnavigator in Ihrem XCode-Arbeitsbereich / -Projekt.
Drücken Sie im Editor-Menü von XCode (wie von nhgrif erwähnt) die Option "Alle Ansichten aktualisieren". Dies wird dazu führen, dass IB eine Kompilierung für eine ganze Reihe von Dingen startet, die Sie sicher nicht erwarten würden.
Klicken Sie im Berichtsnavigator auf "Nach Gruppe", um Inhalte zu filtern und den Abschnitt "Interface Builder" anzuzeigen. Sie werden sehen, dass zum Laden des benutzerdefinierten IBDesignable Views-Frameworks VIELE Dinge kompiliert werden. Wenn jede dieser Ziele kompiliert dies nicht tun, wie (vielleicht veraltet) Einheit Testziele (auch wenn sie völlig unabhängig von dem Code ist , dass Lasten dieser Ansichten oder Storyboard), dann werden IB beim Laden der DLL fehlschlagen.
In meinem Fall hat IB versucht, 8 Ziele zu kompilieren, darunter 4, bei denen Unit-Tests durchgeführt wurden, die seit den letzten Änderungen an Refactoring, an denen wir gearbeitet haben, nicht aktualisiert wurden.
Die meisten Codeänderungen / -korrekturen, die ich vorgenommen habe, damit IB meine Zollansichten ordnungsgemäß laden und anzeigen kann, wenn sie nicht mit diesen Klassen zusammenhängen oder gar verknüpft sind, und das Storyboard während der Ausführung dieser Komponententests niemals geladen wird. IB war jedoch abhängig vom gesamten Arbeitsbereich, der kompiliert wurde, damit er funktioniert.
quelle
Nur ein kurzer Hinweis für alle anderen, die dieses Problem haben: Denken Sie daran, den Typ der Variablen anzugeben.
quelle
Ich hatte die gleiche Warnung
Ignoring user defined runtime attribute for key path ..
, obwohl ich absolut sicher bin, dass ich mit meiner benutzerdefinierten IBDesignable-Ansichtsklasse nichts falsch gemacht habe.In meinem Fall stellte sich heraus, dass es mit dem Xcode-Cache zu tun hatte.
Spülen
DerivedData
und die Warnung ist weg.quelle
Falls jemand anderes auf den Fehler stößt, existiert die IB Designables-Klasse aus demselben Grund wie ich nicht. Die beste Antwort war nicht mein Problem ... aber hier ist ein leicht verwandtes Problem ...
Im Quellcode des Storyboards ist eine Eigenschaft namens customModule versteckt.
Zum Beispiel hatte ich eine Klasse namens ForwardArrow in einem separaten Framework, das ich versehentlich zu meinem Hauptziel hinzugefügt habe.
Das XML für einige Ansichten endete also als customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"
Als ich sie vom Hauptziel im Build entfernte, aktualisierte das Storyboard MainTargetNameWasHere nicht auf CustomViews. Dies ist das Framework, in dem es sich befand, und gab an, dass keine Klasse einen Fehler gefunden hat.
Also TLDR; Stellen Sie sicher, dass das benutzerdefinierte XML-Attribut in Ihrem Storyboard auf den richtigen Wert festgelegt ist, wenn sich Ihr IBDesignable in einem anderen Framework befindet. Und wenn es überhaupt nicht da ist, füge es hinzu.
Beispiel aus meiner Quelle:
quelle
Als Beispiel habe ich CheckboxButton über einen Pod verwendet und die Grafiken der Checkbox werden nie im Storyboard angezeigt, während ich die gleichen Probleme habe, die in der Frage hier beschrieben wurden:
und
Die Lösung meines Problems bestand darin, das Modul wie folgt mit dem Namen CheckboxButton zu versehen:
Hinweis: Sie sollten CheckboxButton durch den Namen des verwendeten Moduls ersetzen .
quelle
Ich persönlich habe dieses Problem gelöst, indem ich mit der Schaltfläche "-" Inhalte aus meinem Identitätsinspektor gelöscht habe. Wenn Sie benutzerdefinierte Klassen entfernen, den Inhalt im IB ändern und dann eine neue benutzerdefinierte Klasse hinzufügen, werden die gestaltbaren Elemente im Identitätsinspektor nicht entfernt, und ich habe diesen Fehler erhalten. Einfach alles löschen und neu erstellen.
quelle
Ich weiß, dass dies beantwortet wird, aber hier ist noch eine Erfahrung.
Ich hatte einige Probleme, die nichts mit diesem Problem zu tun hatten, aber dabei habe ich @IBInspectable aus den Variablen in meiner Klasse entfernt und die Attribute aus dem Identitätsinspektor (alt-apple-3) gelöscht.
Nachdem ich das (Code-) Problem mit der Komponente behoben hatte, habe ich alles unzählige Male aktualisiert, aber immer noch keine Attribute im Identitätsinspektor.
Schließlich bemerkte ich, dass sie zurück waren, aber nur im Attributinspektor (alt-apple-4) . Sobald ich ihnen dort Werte hinzufügte, tauchten sie wieder im Identitätsinspektor auf
quelle
Die Antwort von Dave Thomas oben gab mir die (umgekehrte) Lösung, als dies nicht bei den anderen (Abgeleitete Daten, Editor> Aktualisieren) der Fall war, aber der Klarheit halber, falls die Leute nicht sicher sind, wo sie das XML bearbeiten sollen ... Sie tun es nicht. muss nicht!
Module
. Für mich war dies leer und ich bekam die gleichen Fehler wie OP. Ich habe dasModule
auf meinen Projektnamen und BAM gesetzt - es hat nach dem Wiederaufbau angefangen zu funktionieren!quelle
Ich habe gerade den Wecker für dieses Problem durchgesehen. Ich habe alle hier und anderswo aufgeführten Dinge ohne Glück ausprobiert. Dies ist ein Storyboard, das für immer einwandfrei funktioniert hat und plötzlich nicht mehr mit dem Problem "Benutzerdefiniertes Laufzeitattribut ignorieren ..." funktioniert.
Aus welchem Grund auch immer, durch Entfernen dieses Codes aus einem meiner IBDesignable wurde Folgendes behoben:
Wenn Sie dies entfernen, werden alle Warnungen auch in anderen IBDesignable-Objekten gelöscht. Ich habe keine Ahnung, warum dieser eine Schritt das Problem behoben hat, aber vielleicht hilft es auch jemand anderem.
quelle
Ich hatte das gleiche Problem und musste CornerRadius und BorderWidth in einen String ändern und dann in CGFloat umwandeln. Dies war die einzige Lösung für mich, um die Werte zu ändern und die Änderungen im Interface Builder anzuzeigen.
quelle
Float
stattdessen verwendenCGFloat
und das stattdessen