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.