Eu tenho o seguinte conjunto de códigos:
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
(Para referência do Swift, esse problema também estava ocorrendo com o código 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
}
}
}
Eu adicionei um UIView
a um controlador de visualização no storyboard e defini sua subclasse como CustomView
.
Isso adiciona a linha "Designables". Ele está preso em "Atualizando" e a dica de ferramenta diz "Aguardando a criação do destino". Nunca muda deste status.
Quando passo para a inspeção de atributos, posso definir estas IBInspectable
propriedades:
E uma vez definidos, eles também aparecem nos "Atributos de tempo de execução definidos pelo usuário":
No entanto, o status "Designáveis" nunca vai além de "Atualizando" com a mesma dica de ferramenta (tentei construir Cmd + B várias vezes, nada muda).
Além disso, conforme defino as IBInspectable
propriedades, recebo um aviso para cada uma:
IBDesignables - Ignorando o atributo de tempo de execução definido pelo usuário para o caminho da chave "borderColor" na instância de "UIView" ... esta classe não é compatível com a codificação do valor da chave para a chave borderColor.
Captura de tela dos avisos gerados:
Estou familiarizado com os problemas de conformidade da codificação de valores-chave e geralmente sei como resolvê-los ... mas não entendo como resolver esse problema aqui. De acordo com o inspetor de identidade da visualização, a visualização é um "CustomView" (não um "UIView" normal, que não tem essas propriedades). E se a visualização não fosse uma "CustomView", essas propriedades projetáveis não apareceriam no Attributes Inspector, certo? Mas quando o Interface Builder tenta aplicar esses atributos à visão, ele volta a pensar que a classe da visão é "UIView" e não pode aplicar os atributos.
Qualquer ajuda? Por favor, deixe-me saber se eu esqueci algum detalhe importante, mas para valer a pena, eu segui este tutorial exatamente (diferente de ObjC vs Swift). Também é importante notar que segui este tutorial exatamente em outra máquina e funcionou perfeitamente (eu pretendia fazer este post ontem à noite, mas o computador que eu estava usando não tinha esse problema).
Com base em comentários, foi sugerido que talvez o .m
arquivo não esteja incluído e isso possa estar causando o problema. Achei que certamente teria saído do meu caminho para que esse cenário fosse o caso, mas verifiquei mesmo assim.
Quando comecei a tentar fazer isso, eu estava entendendo que as IB_DESIGNABLE
aulas deveriam fazer parte de uma UIKit
estrutura diferente . Portanto, nesta primeira captura de tela, você pode ver que configurei uma estrutura "CustomViews", que tem uma classe CustomView
,. Você também verá aqui que eu também criei um OtherView
, que é idêntico a CustomView
, exceto que não está em uma estrutura separada. O problema idêntico persiste no storyboard entre as duas classes, no entanto.
Aqui temos uma captura de tela indicando que CustomView.m
está incluído para ser construído com a CustomViews
estrutura:
Enquanto isso, a captura de tela a seguir indica várias coisas:
CustomViews.framework
está adequadamente incluído no projeto principal.OtherView.m
também é incluído como uma fonte de compilação, portanto, mesmo que haja algo errado comCustomView
,OtherView
deve funcionar, porém gera erros idênticos.Main.storyboard
eLaunchScreen.xib
estão aparecendo em vermelho. Não tenho ideia do porquê, e não tenho a menor idéia de por queLaunchScreen.xib
deveria (eu não toquei neste arquivo), embora eu possa dizer depois de olhar para outros projetos,Main.storyboard
também aparece em vermelho para esses projetos, e eu estou não fazendo nada comIB_DESIGNABLE
ouIBInspectable
lá.
Eu tentei e tentei novamente várias vezes. Funciona sempre no meu computador em casa - não consigo reproduzir o problema descrito nesta pergunta em casa. No trabalho, nunca funciona. O problema descrito nesta pergunta acontece sempre.
Ambos os computadores são Mac Minis adquiridos novos este ano (não os novos modelos, modelo do final de 2012). Ambos os computadores estão executando o OS X Yosemite 10.10. Ambos os computadores estão executando o Xcode versão 6.1. Em casa, a configuração é (6A1052d). Esta manhã, posso confirmar que ambos os computadores estão executando compilações idênticas do Xcode.
Outros me sugeriram que pode ser RAM ruim. Isso parece rebuscado para mim. Reiniciei o projeto várias vezes, reiniciei o computador várias vezes. Parece-me que se houvesse uma RAM danificada em um computador com aproximadamente 6 meses de idade, eu estaria vendo outros problemas e que esse problema seria menos consistente. Mas esse exato problema persiste apesar de várias vezes reiniciar todo o projeto do zero e reiniciar totalmente no computador.
Deve ser importante observar que, se eu realmente compilar e executar este projeto, a visualização personalizada com as IBInspectable
propriedades realmente será exibida como espero que o storyboard a exiba. Imagino que esse seria o caso mesmo sem as diretivas IB_DESIGNABLE
e IBInspectable
, no entanto, já que elas são criadas como Atributos de tempo de execução definidos pelo usuário.