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.
Respostas:
Com base na sugestão do chrisco de depurar a visão selecionada (o que eu já tinha feito, mas tentei novamente para uma boa medida), notei algumas outras opções na parte inferior do menu Editor.
Cliquei em "Atualizar todas as visualizações" e depois que o Xcode pensou um pouco, de repente o storyboard estava exibindo minha visualização conforme o esperado (aplicando corretamente minhas
IBInspectable
propriedades).Em seguida, repassei todo o processo para confirmar que essa é a solução.
Criei uma nova classe
ThirdView
,. Esta classe é idêntica às outras, novamente. Mudei a classe da minha visão paraThirdView
e peguei algo um pouco diferente desta vez:Clicar em "Mostrar" para os avisos:
Um novo desta vez:
Isso não é realmente mais útil do que o que já existia. Além disso, agora os outros três avisos dobraram para 6 estranhamente.
De qualquer forma, se eu clicar em "Atualizar todas as visualizações" no menu suspenso do Editor novamente, todos os erros desaparecerão e, mais uma vez, a visualização será exibida corretamente.
Ainda assim, até este ponto, tudo o que eu fiz foi coisas que nunca mexi em casa. Em casa, simplesmente funcionou. Então, ativei "Atualizar automaticamente as visualizações" e criei um "FourthView" para testar - mais uma vez, idêntico aos três primeiros.
Depois de alterar a classe da visualização para "FourthView", o rótulo designável disse "Atualizando" por um breve momento e finalmente disse "Atualizado":
Então, eu verifiquei meu computador em casa. A opção "Atualizar visualizações automaticamente" está ativada no computador que estava sempre funcionando. Estava desligado no computador que não estava. Não me lembro de ter tocado nessa opção do menu. Eu não posso nem dizer com certeza se ele existia antes do Xcode 6. Mas essa opção é o que estava fazendo a diferença.
TL; DR, se você estiver tendo o mesmo problema descrito na pergunta, certifique-se de que "Atualizar automaticamente as visualizações" esteja ativado (ou manualmente "Atualizar todas as visualizações" quando precisar de uma atualização no IB):
fonte
Eu tenho mais alguns detalhes que podem fazer com que suas classes IBDesignable não sejam carregadas.
Selecione seu storyboard / xib problemático onde suas visualizações personalizadas devem ser exibidas.
Na área do navegador, vá para o Report Navigator em sua área de trabalho / projeto XCode.
No menu Editor do XCode, clique (conforme mencionado por nhgrif), a opção "Atualizar todas as visualizações". Isso fará com que o IB lance uma compilação para um monte de coisas que você, tenho certeza, não esperaria.
No Report Navigator, clique em "By Group" para filtrar o conteúdo e veja a seção "Interface Builder". Você verá que, para carregar a estrutura de visualizações personalizadas do IBDesignable, ela compilará MUITAS coisas. Se algum desses alvos NÃO compilar, como alvos de teste de unidade (talvez obsoletos) (mesmo se eles não estiverem totalmente relacionados ao código que carrega essas visualizações ou storyboard), o IB falhará ao carregar sua dll.
No meu caso, o IB tentou compilar 8 alvos, incluindo 4 onde testes de unidade que não foram atualizados desde as recentes mudanças de refatoração nas quais estamos trabalhando.
A maioria das alterações / correções de código que fiz para que o IB carregue e exiba corretamente minhas visualizações personalizadas, quando não relacionadas ou mesmo vinculadas a essas classes, nem carregaria o storyboard durante a execução desses testes de unidade. Mesmo assim, o IB dependia de toda a compilação do espaço de trabalho para que funcionasse.
fonte
Apenas uma dica rápida para qualquer pessoa com esse problema: lembre-se de especificar o tipo da variável.
fonte
Recebi o mesmo aviso
Ignoring user defined runtime attribute for key path ..
, embora tenha absoluta certeza de que não fiz nada de errado com minha classe de visualização IBDesignable personalizada.Acontece que, no meu caso, tinha a ver com o cache do Xcode.
Limpe
DerivedData
e o aviso desaparece.fonte
No caso de qualquer outra pessoa se deparar com o erro IB Designables class does not exist, pelo mesmo motivo que eu. A resposta principal não foi meu problema ... mas aqui está um problema ligeiramente relacionado ...
Há uma propriedade oculta no código-fonte do storyboard chamada customModule.
Por exemplo, eu tinha uma classe chamada ForwardArrow dentro de uma estrutura separada que acidentalmente adicionei ao meu destino principal.
Portanto, o XML para algumas visualizações acabou como customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"
Quando eu os removi do alvo principal na construção, o storyboard não atualizou MainTargetNameWasHere para CustomViews que é o framework onde ele estava localizado e começou a dar aquele erro de nenhuma classe encontrada.
Portanto, TLDR; Certifique-se de que, se o seu IBDesignable estiver em outra estrutura, o atributo customModule xml em seu storyboard esteja definido com o valor correto. E se não estiver lá, adicione-o.
Exemplo da minha fonte:
fonte
Como meu exemplo, eu estava usando o CheckboxButton via pod e os gráficos do checkbox nunca aparecem no storyboard, embora eu tenha os mesmos problemas descritos na pergunta aqui:
e
A forma como resolvi meu problema foi fornecer o módulo com o nome CheckboxButton conforme abaixo:
Nota: você deve substituir CheckboxButton por qualquer nome do módulo que você está usando.
fonte
Resolvi pessoalmente esse problema usando o botão "-" para excluir o conteúdo do meu inspetor de identidade. Quando você remove classes personalizadas, altera o conteúdo no IB e, em seguida, adiciona uma nova classe personalizada, os elementos designáveis no inspetor de identidade não são removidos e isso me causou esse erro. Basta excluir tudo e reconstruir.
fonte
Eu sei que isso está respondido, mas aqui está mais uma experiência.
Eu estava tendo alguns problemas não relacionados a esse problema, mas no processo removi @IBInspectable dos vars em minha classe e excluí os atributos do inspetor de identidade (alt-apple-3).
Depois de corrigir o problema (código) com o componente, atualizei tudo várias vezes, mas ainda não havia atributos no inspetor de identidade.
Eventualmente, percebi que eles estavam de volta, mas apenas no inspetor de atributos (alt-apple-4) . Assim que adicionei valores a eles lá, eles reapareceram no inspetor de identidade
fonte
A resposta de Dave Thomas acima me deu a solução (reversa), quando não dos outros (Dados derivados, Editor> Atualizar), mas por uma questão de clareza, caso as pessoas não tenham certeza de onde editar o XML ... você não não preciso!
Module
. Para mim, isso estava vazio e eu estava recebendo os mesmos erros do OP. Eu defini oModule
com o nome do meu projeto e BAM - ele começou a funcionar após a reconstrução!fonte
Eu acabei de falar sobre esse problema. Tentei todas as coisas listadas aqui e em outros lugares, sem sorte. Este é um storyboard que funcionou bem para sempre e de repente parou de funcionar com o problema "Ignorando atributo de tempo de execução definido pelo usuário ...".
Por alguma razão, remover este código de um dos meus IBDesignable corrigiu:
remover isso fazia com que todos os avisos fossem embora, mesmo em outros objetos IBDesignable. Não tenho ideia de por que essa única etapa corrigiu isso, mas talvez ajude outra pessoa também.
fonte
Eu estava tendo o mesmo problema e tive que mudar o cornerRadius e o BorderWidth para ser uma String e então convertê-lo para CGFloat, era a única solução para eu poder mudar os valores e ver as mudanças no construtor de interface.
fonte
Float
vez deCGFloat
e lançar isso