ios - library - @IBDesignable error: IB Designables: falha ao atualizar o status do layout automático: o Interface Builder Cocoa Touch Tool travou



failed and (14)

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 objeto UITextView no Identity Inspector para PlaceholderTextView , eu posso definir a propriedade Placeholder 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 sentido, pois nem estou substituindo drawRect (). Alguma ideia?

https://src-bin.com


Answer #1

É como se você obtivesse o código de outro desenvolvedor e recebesse esse erro. Apenas corra

pod install

Isso funcionou para mim. Espero que ajude.


Answer #2

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.


Answer #3

Adicione-o ao final do seu Podfile e execute a pod install

# Workaround for Cocoapods issue #7606

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
            config.build_settings.delete('CODE_SIGNING_ALLOWED')
            config.build_settings.delete('CODE_SIGNING_REQUIRED')
        end
    end

Answer #4

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.


Answer #5

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:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // custom setup
}

override init(frame: CGRect) {
    super.init(frame: frame)

    // custom setup
}

Answer #6

Eu estava tendo problemas semelhantes com o Interface Builder que renderizavam designáveis.

Usando a técnica sugerida nesta answer , consegui rastrear o problema com o uso de literais de imagem.

Falha na renderização

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

Nenhuma falha de renderização

self.backgroundImage.image =  UIImage(named: "rectangleCenter")

Answer #7

Eu tive o mesmo problema e o resolvi adicionando o 'use_frameworks!' ao Podfile do meu projeto.

Espero que ajude você.


Answer #8

Há relatórios de falha gerados quando o Interface Builder Cocoa Touch Tool falha. As teses estão localizadas em ~/Library/Logs/DiagnosticReports e denominadas IBDesignablesAgentCocoaTouch_*.crash . No meu caso, eles continham um rastreamento de pilha útil que identificou o problema no meu código.


Answer #9

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 à configuração de compilação dos caminhos de pesquisa de caminho de execução


Answer #10

No meu caso, eu estava fazendo o próximo nos métodos initWithFrame / initWithCoder para criar a exibição:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Parece que eu não deveria usar o pacote principal , mas o pacote da classe. Então, substituí o código pelo seguinte e funcionou:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

Eu pensei que talvez isso possa ajudar alguém.


Answer #11

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 renderização do IBDesignable funcionou bem.


Answer #12

Para o Xcode 8 - Swift

Adicionando valor opcional como valor padrão em @IBInspectable causando um problema para mim.

Isso não vai funcionar:

@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
      didSet {
       // configureView
      }
}

Isso deve funcionar:

@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
    didSet {
        // configureView()
    }
}

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}

Answer #13

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.


Answer #14

Verifique se você não está inicializando diretamente o UIImage ou o UIFont usando ativos ou fontes adicionados ao seu projeto.

Eu sempre crio uma private func setUp() nas minhas classes de UI personalizadas @IBDesignable . que é chamado de init(frame: CGRect) , init?(coder aDecoder: NSCoder) . Finalmente, atualizei o setup() da seguinte maneira.

private func setUp() {

     //... Doing initial configurations

     // iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
     if let icon = UIImage(named: "IconImageName") {
          iconImageView.image = icon
          iconImageView.frame.size = icon.size
     }

     // nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
     if let font = UIFont(name: "Calibri-Light", size: size) {
          nameLabel.font =  font
     } else {
          nameLabel.font = UIFont.systemFont(ofSize: size) 
     }

     // Doing other stuffs
}




interface-builder