Eu tenho uma subclasse muito simples de UITextView que adiciona a funcionalidade "Espaço reservado" que você pode encontrar nativa para o objeto Campo de texto. Aqui está o meu código para a subclasse:
import UIKit
import Foundation
@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
@IBInspectable var placeholder: String = "" {
didSet {
setPlaceholderText()
}
}
private let placeholderColor: UIColor = UIColor.lightGrayColor()
private var textColorCache: UIColor!
override init(frame: CGRect) {
super.init(frame: frame)
self.delegate = self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidBeginEditing(textView: UITextView) {
if textView.text == placeholder {
textView.text = ""
textView.textColor = textColorCache
}
}
func textViewDidEndEditing(textView: UITextView) {
if textView.text == "" && placeholder != "" {
setPlaceholderText()
}
}
func setPlaceholderText() {
if placeholder != "" {
if textColorCache == nil { textColorCache = self.textColor }
self.textColor = placeholderColor
self.text = placeholder
}
}
}
Depois de alterar a classe do UITextView
objeto no Identity Inspector para PlaceholderTextView
, eu posso definir a Placeholder
propriedade muito bem no Attribute Inspector. O código funciona muito bem ao executar o aplicativo, mas não exibe o texto do espaço reservado no criador da interface. Também recebo os seguintes erros sem bloqueio (presumo que seja por isso que não seja renderizado em tempo de design):
erro: IB Designáveis: falha ao atualizar o status do layout automático: o Interface Builder Cocoa Touch Tool travou
erro: IB Designáveis: falha ao renderizar a instância do PlaceholderTextView: A renderização da exibição levou mais de 200 ms. Seu código de desenho pode sofrer com desempenho lento.
Não consigo descobrir o que está causando esses erros. O segundo erro não faz nenhum sentido, pois nem estou substituindo drawRect (). Alguma ideia?
fonte
Respostas:
Há relatórios de falha gerados quando o Interface Builder Cocoa Touch Tool falha. Teses estão localizadas
~/Library/Logs/DiagnosticReports
e nomeadasIBDesignablesAgentCocoaTouch_*.crash
. No meu caso, eles continham um rastreamento de pilha útil que identificou o problema no meu código.fonte
initFrame(frame: CGRect)
deve ser definido. Faça isso se você fornecer seu próprioinit
método (s).init(frame: CGRect)
explicitamente o porque tinha umini
método personalizado . Você pode procuraruse of unimplemented initializer 'init(frame:)'
diretamente no relatório de falhaApplication Specific Information
no relatório. Obrigado rapazes! Dupla vitória nesta resposta!Eu tive o mesmo problema algumas vezes. As duas vezes começaram quando eu carregava uma ponta do IBDesignable no storyboard quando a ponta não era capaz de caber na vista (ou seja, eu tinha um botão fora do UIView, mas ainda estava na ponta). Depois que eu consertei o Xcode, ele ainda me dava erros, então reiniciei o Xcode até que ele parasse aleatoriamente de me dar o erro.
Eu espero que isso ajude.
ATUALIZAÇÃO: Acabei de matar todos os processos chamados "Interface Builder Cocoa Touch Tool", reiniciei o Xcode e o erro desapareceu. Não sei se isso sempre funcionará ou não.
fonte
init
métodos, o código publicado como parte da pergunta não mostrará mais osIB Designables
erros e o espaço reservado será renderizado corretamente no Interface Builder.No meu caso, eu estava fazendo o próximo nos métodos initWithFrame / initWithCoder para criar a exibição:
Parece que eu não deveria usar o pacote principal , mas o pacote da classe. Então, substituí esse código pelo seguinte e funcionou:
Eu pensei que talvez isso possa ajudar alguém.
fonte
let bundle = Bundle(for: ValidatingTextField.self)
em SwiftVocê poderia selecionar sua exibição personalizada no Interface Builder e uso, em seguida
Editor
,Debug Selected Views
. Ele iniciará a chamadaIBDesignableAgentCocoaTouch
sessão de depuração quando todos os pontos de interrupção (incluindo pontos de interrupção de exceção) funcionarem e você puder identificar exatamente o local em que sua exibição falha.fonte
Para o Xcode 8 - Swift
Adicionar valor opcional como valor padrão ao
@IBInspectable
causar problema para mim.Isso não vai funcionar:
Isso deve funcionar:
fonte
Eu estava tendo problemas semelhantes com o Interface Builder que renderizavam designáveis.
Usando a técnica sugerida nesta resposta , consegui rastrear o problema para o uso de literais de imagem.
Falha na renderização
Nenhuma falha de renderização
fonte
Na verdade, se você tiver alguns atributos antigos definidos pelo usuário (que não são válidos para a exibição atual) em qualquer exibição do storyboard, isso pode causar uma falha no seu agente.
Além disso, às vezes acontece apenas por causa de um bug desagradável do Xcode. Para conferir, quando estiver no storyboard, desmarque Editor> Atualizar automaticamente vistas, depois vá para outro arquivo, limpe e reinicie seu projeto. Depois de inserir o storyboard novamente, você pode clicar em Editor> Atualizar Visualizações e verificar o automático novamente. Essa também resolveu o meu problema uma vez.
Se os dois não funcionaram, provavelmente você fez algo errado na sua visualização do IBDesignable. Escolha suas visualizações com falha no storyboard e depure clicando em Editor> Visualizações de Depuração
fonte
Este não é o caso desta pergunta, mas talvez eu ajude outra pessoa.
Eu tive um problema semelhante quando na minha classe @IBDesignable não implementei os dois:
fonte
Eu tive o mesmo problema e o resolvi adicionando o 'use_frameworks!' ao Podfile do meu projeto.
Espero que ajude você.
fonte
No meu caso, estava de alguma forma relacionado a uma estrutura de cartago que eu estava usando. Eu tive que adicionar $ (PROJECT_DIR) / Carthage / Build / iOS aos caminhos de pesquisa do caminho de execução configuração de compilação dos
fonte
No meu caso, houve um problema com o OneSignal. Aparentemente, eles têm um bug na versão 2.2.0 e acima. Mudou para 2.1.6 e tudo está ótimo de novo!
Confira isso .
fonte
Quando eu depurei isso, descobri que existem algumas classes que estão modificando a interface do usuário. Normalmente, marquelabel, que é uma subclasse de UILabel ou qualquer outra classe de subclasse de UIView, desenhando a interface do usuário em tempo de execução e colidindo com o mecanismo de Autolayout. Tente dar largura ou altura fixas para essas visualizações personalizadas. Se isso não resolver o seu problema, tente as seguintes soluções: -
Solução 1: - Remova o comentário #use_frameworks dentro do seu arquivo pod.
Solução 2: - Tente excluir os dados derivados. 1. Feche a janela Editor do seu Xcode e saia do simulador -> 2. Vá para Xcode Preferences -> Locations -> 3. Clique na pequena seta cinza mostrando o caminho dos dados derivados -> 4. Selecione seu projeto -> 5. Exclua todas as pastas dentro -> 6. Saia do Xcode e reabra
fonte
Adicione-o ao final do seu Podfile e execute
pod install
fonte
Adicione este script no final do meu
Podfile
e executeipod install
novamente.fonte
Um dos principais problemas é quando você cria o @ IBDesignable, verifique se o arquivo cocoapod não está incluído nos UITests, caso contrário, causará essa falha.
fonte
Acho que o motivo é o seu xib não ter o mesmo tamanho do design do storyboard. Verifique se o xib tem a mesma altura e largura.
fonte
Eu estava apenas faltando esta linha de código
platform :ios, '7.0'
e o problema foi resolvido. Apenas esta linha no seu arquivo pod e a atualização do problema do seu pod serão resolvidas.fonte
Para mim, faltava um certificado de assinatura, porque nunca executei o aplicativo, portanto o Xcode ainda não criou um certificado. Depois de executar o aplicativo, a
IBDesignable
renderização funcionou bem.fonte
É como se você obtivesse o código de outro desenvolvedor e recebesse esse erro. Apenas corra
Isso funcionou para mim. Espero que ajude.
fonte
Verifique se você não está inicializando diretamente
UIImage
ouUIFont
usando recursos ou fontes adicionados ao seu projeto.Eu sempre crio um
private func setUp()
em minhas classes@IBDesignable
personalizadasUI
. que é chamado deinit(frame: CGRect)
,init?(coder aDecoder: NSCoder)
. Então, finalmente atualizeisetup()
o seguinte.fonte
Deixe-o construir e executar no simulador se você tiver algum erro em algum outro lugar no projeto. Basta comentar e executar o design primeiro para atualizar o design e descomentar os outros códigos. Funciona para mim.
fonte