J'ai l'ensemble de code suivant:
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
(Pour référence Swift, ce problème se produisait également avec le code 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
}
}
}
J'ai ajouté un UIView
à un contrôleur de vue sur le storyboard et défini sa sous-classe sur CustomView
.
Cela ajoute la ligne «Designables». Il est bloqué sur "Mise à jour" et l'info-bulle indique "En attente de la création de la cible". Cela ne change jamais de ce statut.
Lorsque je passe à l'inspection des attributs, je suis en mesure de définir ces IBInspectable
propriétés:
Et une fois définis, ils apparaissent également dans les "Attributs d'exécution définis par l'utilisateur":
Cependant, le statut "Designables" ne se déplace jamais au-delà de "Mise à jour" avec toujours la même info-bulle (j'ai essayé la construction Cmd + B plusieurs fois, rien ne change).
De plus, lorsque je règle le IBInspectable
propriétés, j'obtiens un avertissement pour chacun:
IBDesignables - Ignorer l'attribut d'exécution défini par l'utilisateur pour le chemin de clé "borderColor" sur l'instance de "UIView" ... cette classe n'est pas compatible avec le codage clé-valeur pour la clé borderColor.
Capture d'écran des avertissements générés:
Je connais les problèmes de conformité au codage clé-valeur et je sais généralement comment les résoudre ... mais je ne comprends pas comment résoudre ce problème ici. Selon l'inspecteur d'identité de la vue, la vue est un "CustomView" (pas un "UIView" normal, qui n'a pas ces propriétés). Et si la vue n'était pas une "vue personnalisée", ces propriétés personnalisables n'apparaîtraient pas dans l'inspecteur d'attributs, n'est-ce pas? Mais quand Interface Builder essaie d'appliquer ces attributs à la vue, il revient à penser que la classe de la vue est "UIView" et ne peut pas appliquer les attributs.
De l'aide? S'il vous plaît laissez-moi savoir si j'ai omis certains détails importants, mais pour ce que cela vaut, j'ai suivi ce tutoriel exactement (autre que ObjC vs Swift). Il est également intéressant de noter que j'ai suivi ce tutoriel exactement sur une autre machine et que cela a fonctionné comme un charme (j'avais l'intention de faire ce post la nuit dernière mais l'ordinateur sur lequel j'étais alors n'avait pas ce problème).
Sur la base des commentaires, il a été suggéré que le .m
fichier n'est peut-être pas inclus et que cela pourrait être à l'origine du problème. Je pensais sûrement que j'aurais fait tout mon possible pour que ce scénario soit le cas, mais j'ai quand même vérifié.
Quand j'ai commencé à essayer de faire cela, j'étais sous la compréhension que les IB_DESIGNABLE
classes devaient faire partie d'un UIKit
cadre différent . Donc , à partir de cette première capture d' écran, vous pouvez voir que je mis en place un cadre « CustomViews », qui a une classe, CustomView
. Vous verrez également ici que j'ai également créé un OtherView
, qui est identique à CustomView
, sauf que ce n'est pas dans un cadre séparé. Le problème identique persiste sur le storyboard entre les deux classes cependant.
Ici, nous avons une capture d'écran indiquant qu'il CustomView.m
est inclus pour être construit avec le CustomViews
framework:
Pendant ce temps, la capture d'écran suivante indique plusieurs choses:
CustomViews.framework
est correctement inclus dans le projet principal.OtherView.m
est également inclus comme source de compilation, donc même si quelque chose ne va pas avecCustomView
,OtherView
devrait fonctionner, mais il génère des erreurs identiques.Main.storyboard
etLaunchScreen.xib
apparaissent en rouge. Je n'ai aucune idée pourquoi, et je n'ai pas la moindre idée de pourquoiLaunchScreen.xib
(je n'ai pas touché à ce fichier), bien que je puisse dire après avoir regardé d'autres projets,Main.storyboard
apparaît également en rouge pour ces projets, et je suis ne rien faire avecIB_DESIGNABLE
ouIBInspectable
là.
J'ai essayé et réessayé plusieurs fois maintenant. Cela fonctionne à chaque fois sur mon ordinateur à la maison - je ne peux pas reproduire le problème décrit dans cette question à la maison. Au travail, ça ne marche jamais. Le problème décrit dans cette question se produit à chaque fois.
Les deux ordinateurs sont des Mac Minis achetés neufs cette année (pas les nouveaux modèles, modèle fin 2012). Les deux ordinateurs exécutent OS X Yosemite 10.10. Les deux ordinateurs exécutent Xcode version 6.1. À la maison, la construction est (6A1052d). Ce matin, je peux confirmer que les deux ordinateurs exécutent des versions identiques de Xcode.
D'autres m'ont suggéré qu'il pourrait s'agir d'une mauvaise RAM. Cela me semble exagéré. J'ai redémarré le projet plusieurs fois, redémarré l'ordinateur plusieurs fois. Il me semble que s'il y avait une mauvaise RAM sur un ordinateur d'environ 6 mois, que je verrais d'autres problèmes, et que ce problème serait moins cohérent. Mais ce problème exact persiste malgré le redémarrage à plusieurs reprises de l'ensemble du projet à partir de zéro et des redémarrages complets sur l'ordinateur.
Il convient de noter que si je compile et exécute réellement ce projet, la vue personnalisée avec les IBInspectable
propriétés s'affiche réellement comme je m'attends à ce que le storyboard l'affiche. J'imagine que ce serait le cas même sans le IB_DESIGNABLE
etIBInspectable
directives , car elles sont créées en tant qu'attributs d'exécution définis par l'utilisateur.