Ho il seguente set di codice:
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
(Per riferimento Swift, questo problema si verificava anche con il codice Swift)
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
}
}
}
Ho aggiunto un UIView
a un controller di visualizzazione sullo storyboard e ho impostato la sua sottoclasse su CustomView
.
Ciò aggiunge la riga "Designables". È bloccato su "Aggiornamento" e la descrizione comando dice "In attesa di creazione del target". Non cambia mai da questo stato.
Quando passo alla verifica degli attributi, posso impostare queste IBInspectable
proprietà:
E una volta impostati, vengono visualizzati anche negli "Attributi di runtime definiti dall'utente":
Tuttavia, lo stato "Designabili" non va mai oltre "Aggiornamento" con sempre lo stesso suggerimento (ho provato a compilare Cmd + B più volte, non cambia nulla).
Inoltre, mentre imposto le IBInspectable
proprietà, ricevo un avviso per ognuna:
IBDesignables - Ignorando l'attributo di runtime definito dall'utente per il percorso della chiave "borderColor" sull'istanza di "UIView" ... questa classe non è conforme alla codifica del valore-chiave per la chiave borderColor.
Screenshot degli avvisi generati:
Conosco i problemi relativi alla codifica di valori-chiave e generalmente so come risolverli ... ma non capisco come risolvere questo problema qui. Secondo l'ispettore identità della vista, la vista è una "CustomView" (non una normale "UIView", che non ha queste proprietà). E se la vista non fosse una "Visualizzazione personalizzata", queste proprietà progettabili non sarebbero visualizzate nell'ispettore degli attributi, giusto? Ma quando Interface Builder tenta di applicare questi attributi alla vista, torna a pensare che la classe della vista sia "UIView" e non può applicare gli attributi.
Qualsiasi aiuto? Per favore fatemi sapere se ho tralasciato alcuni dettagli importanti, ma per quello che vale, ho seguito esattamente questo tutorial (diverso da ObjC vs Swift). Vale anche la pena notare che ho seguito questo tutorial esattamente su un'altra macchina e ha funzionato a meraviglia (intendevo fare questo post ieri sera ma il computer su cui ero allora non aveva questo problema).
Sulla base dei commenti, è stato suggerito che forse il .m
file non è incluso e che potrebbe essere la causa del problema. Ho pensato che sicuramente avrei fatto di tutto per questo scenario, ma ho controllato comunque.
Quando ho iniziato a tentare di farlo, ero consapevole che le IB_DESIGNABLE
classi dovevano far parte di un diversoUIKit
quadro . Quindi, da questo primo screenshot, si può vedere che ho creato un quadro "CustomViews", che ha una classe, CustomView
. Vedrai anche qui che ho anche creato un OtherView
, che è identico a CustomView
, tranne che non è in un framework separato. Lo stesso problema persiste nello storyboard tra le due classi.
Qui abbiamo uno screenshot che indica che CustomView.m
è incluso per essere compilato conCustomViews
framework:
Nel frattempo, la seguente schermata indica diverse cose:
CustomViews.framework
è opportunamente incluso nel progetto principale.OtherView.m
è incluso anche come sorgente di compilazione, quindi anche se qualcosa non vaCustomView
,OtherView
dovrebbe funzionare, tuttavia genera errori identici.Main.storyboard
eLaunchScreen.xib
vengono visualizzati come rossi. Non ho idea del perché, e non ho la minima idea del perchéLaunchScreen.xib
dovrebbe (non ho toccato questo file), anche se posso dire dopo aver guardato altri progetti,Main.storyboard
appare anche in rosso per quei progetti, e sono non fare nulla conIB_DESIGNABLE
oIBInspectable
lì.
Ho provato e riprovato diverse volte. Funziona ogni volta sul mio computer a casa - non posso riprodurre il problema descritto in questa domanda a casa. Al lavoro, non funziona mai. Il problema descritto in questa domanda si verifica ogni volta.
Entrambi i computer sono Mac Mini acquistati nuovi quest'anno (non i nuovi modelli, modello di fine 2012). Entrambi i computer eseguono OS X Yosemite 10.10. Entrambi i computer eseguono Xcode versione 6.1. A casa, la build è (6A1052d). Questa mattina, posso confermare che entrambi i computer eseguono build identiche di Xcode.
Altri mi hanno suggerito che potrebbe essere una cattiva RAM. Mi sembra inverosimile. Ho riavviato il progetto più volte, riavviato il computer più volte. Mi sembra che se ci fosse una cattiva RAM su un computer di circa 6 mesi, vedrei altri problemi e questo problema sarebbe meno consistente. Ma questo problema esatto persiste nonostante numerose volte il riavvio dell'intero progetto da zero e il riavvio completo sul computer.
Vale la pena notare che se compilo ed eseguo effettivamente questo progetto, la visualizzazione personalizzata con le IBInspectable
proprietà viene effettivamente visualizzata come mi aspetto che lo storyboard lo visualizzi. Immagino che questo sarebbe il caso anche senza le direttive IB_DESIGNABLE
e IBInspectable
, tuttavia, poiché queste vengono create come attributi di runtime definiti dall'utente.