Xcode 8 - IB Designables - Falha ao renderizar e atualizar o status do layout automático. O agente travou


167

Atualizei recentemente para o Xcode 8 e estou tendo problemas com o Storyboard.

Se eu abrir o projeto e não tiver o Storyboard aberto, ele será compilado e executado muito bem. Depois de abrir o Storyboard, recebo vários erros sobre o IB Designables, como mostrado abaixo.

insira a descrição da imagem aqui

Essas visualizações são as únicas que estão usando visualizações personalizadas TextFieldEffectse BEMCheckboximportadas usando Cocoapods.


Talvez verifique o repositório do Pod que você está usando e veja se esse problema prevalece entre outros usuários?
Zolnoor 27/09/16

Alguma resposta relevante para isso?
Mohsin Khubaib Ahmed

1
vocês encontraram alguma solução alternativa?
mergulho

Cuidado, o problema pode ser necessário para uma biblioteca incorporada . no meu exemplo, eu tinha o Swifter incorporado. Naturalmente, você mantém à mão uma compilação gorda (para desenvolvimento - simulador / telefone) e uma compilação somente por telefone (apenas para loja de aplicativos, telefone) e apenas troca para a versão apenas por telefone quando necessário para enviar ao TestFlight etc. tinha a biblioteca apenas por telefone no projeto !!!!! Doh! Trocar a gordura "correta" corrigiu o problema.
Fattie 02/08/19

Respostas:


179

Você pode tentar uma das seguintes ações para descobrir a causa:

  1. procure os IBDesignablesAgentCocoaTouchlogs neste diretório: ~/Library/Logs/DiagnosticReportse veja a causa.

Nota: para usuário com Catalina: procure IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Vá para o Editor -> Debug Selected View enquanto seleciona seu @IBDesignable UIViewno storyboard e veja o rastreamento da pilha.

  2. Excluir pasta Derivar dados.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
  3. Limpe seu projeto Shift + Command + Alt + K .

  4. Crie seu projeto Command + B .


35
Usando essa abordagem, pude descobrir que o motivo era esse Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Eu não sabia que o IBDesignablesAgentCocoaTouchprocesso chama init(frame:), em vez de init?(coder aDecoder:).
Yevhen Dubinin

5
@YevhenDubinin Obrigado, isso me ajudou. Tudo estava bem depois que eu implementado init(frame:)na minha UIButton subclasse
doraemon

2
Este fixa o meu problema, mas eu tive que sair xCode antes de excluir dados derivados
Husam

2
a melhor resposta init (frame :) é um problema comum
Michał Ziobro 16/10

1
Saia do xcode e limpe DerivedData. Resolveu o problema.
Mubashar

80

Resolvi o problema, fazendo o seguinte:

  1. Vá para File > Workspace settings.
  2. Clique na pequena seta direita ao lado de "Dados derivados". Isso abre o aplicativo Finder no local da DerivedDatapasta.
  3. Vá para dentro da DerivedDatapasta e exclua a pasta correspondente ao seu projeto.
  4. Saia do Xcode e abra-o novamente.
  5. Limpe seu projeto shiftcommandk.
  6. construa seu projeto commandb.
  7. Abra seu storyboard.
  8. Vá para Editor > Refresh all views.

Atualizada

Às vezes, apenas diretamente Ir para o Editor > Refresh all viewstrabalho. Se Refresh all viewsestiver desativado, feche o Xcode e tente novamente.


Obrigado por postar isso. Fiz uma exclusão da linha de comando da "velha escola" dos dados derivados, mas o problema persistiu. Usar seu método resolveu o problema para mim.
Adrian

Atualize todas as visualizações da vitória para mim também. Obrigado!
Mike K.

56

Acabei de excluir a exibição que falhou e pressione o comando + Z para desfazer a exclusão. Funciona para mim.

Se editar a exibição com falha posteriormente, o erro poderá ocorrer novamente, faça o acima acima novamente.


6
É ridículo, mas funcionou.
Ansari

1
Impressionante!! Trabalhou para mim
Nupur Sharma

1
Quem sabe isso pode ser a resposta. Funcionou eu ainda não posso acreditar
Asad Amodi

37

Eu enfrentei esse problema no CocoaPod 1.5.0. A solução é reinstalar o pod novamente (instalação do pod novamente) assim que este erro aparecer ou você pode usar o CocoaPod 1.4.0. Funciona bem na 1.4.0 (pelo menos para mim.)

atualizar:

Adicionar o seguinte script no Podfile me ajuda a resolver o problema na versão 1.5.0

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

referência: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


100% verdade. o downgrade para 1.4.0 resolveu o problema para mim.
ale_stro

4
Trabalhou, 1.5.0 pods.
precisa saber é o seguinte

3
-lo s work for me, you should add end` para durar de código.
Mahdi

1
Trabalhou para mim também. Tentei todas as outras sugestões sem sucesso. Testado com Pods 1.3.1
Sal

18

Adicionar o código a seguir à minha @IBDesignableclasse fez o truque.

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

Isso funciona para mim. De fato, adicionei duas substituições para estender UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Em seguida, reconstrua e avise (erro) que foi. Nem precisa limpar a pasta de compilação.
John Pang

Obrigado! Boa resposta)
JiosDev

13

Para qualquer pessoa, como eu, que não consegue encontrar esse IBDesignablesAgentCocoaToucharquivo ou ao tentar 'Depurar vistas selecionadas' no Editor obtém um erro, aqui está outra maneira de depurar os erros "Falha ao renderizar".

Abra o aplicativo 'Console'; na barra lateral, selecione o seu Mac atual (provavelmente será selecionado automaticamente por padrão) e, na barra de pesquisa, pesquise "IBSceneUpdate" e pressione Enter.

Dessa forma, toda vez que você receber um erro do Xcode por IBDesignablenão conseguir renderizar, também receberá uma nova entrada "IBSceneUpdate" com mais detalhes sobre o erro.

Foi assim que eu pude depurar meus IBDesignableerros!

Aplicativo de console mostrando erros do IBSceneUpdate


1
O aplicativo é um console real e não um terminal, assim como um FYI.
Carl Upton

Boa pegada! Editou minha resposta.
Stelabouras 09/08/19

12

Se você estiver usando o arquivo xib para a visualização personalizada. Tente o seguinte:

Alterar de

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

Para:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)

8

Tente desativar 'Usar variações de características' (painel Identidade e Tipo) para qualquer arquivo xib que você possa ter para visualizações personalizadas usadas em seu storyboard.


7

meu problema foi resolvido com a exclusão de pastas (relacionadas a este projeto) da pasta de dados derivados. você pode fazer isso clicando em Arquivo -> Configuração do projeto -> e, em seguida, clique no sinal de seta ao lado de /Users/.../Xcode/DerivedData clique na pasta DerivedData e verá as pastas nomeadas do seu projeto excluindo-as. saia do xcode para abrir seu projeto, limpe-o usando esta etapa Produto-> limpo e crie o projeto: Produto-> Construção Isso resolverá esses problemas.


4

Resposta correta fornecida por @Maria :

verifique o relatório de falha em ~/Library/Logs/DiagnosticReports

Maneira alternativa :

  1. abrir Spotlight

insira a descrição da imagem aqui

  1. tipo console.app

insira a descrição da imagem aqui

  1. selecionar Crash reports

insira a descrição da imagem aqui

  1. verifique um IBDesignablesAgent-iOSe revise o log de falha

O uso do console foi o que me ajudou a resolver meu problema. Mensagens muito mais detalhadas do que as que estavam no Xcode.
Andrew Moore

3

Basta abrir seu storyboard -> Editor -> Atualizar todas as visualizações. Este trabalho para mim.


3

Tentei limpar e executar o projeto não resolverá esse problema.

Mas Close e reabriu o projeto.


2

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 dados derivados

  1. Feche a janela do 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

1
Você poderia explicar como isso realmente resolve o problema?
Paula Hasstenteufel

isso resolveu o problema, mas ainda sei não faça porque uncoment que use_frameworks porque isso é para certo projeto rápida
Abhishek

Meu Podfile já está usando frameworks, alguma sugestão além de descomentar isso?
mmr118

@ moni15 eu adicionei mais uma solução possível. Por favor, verifique.
Ashish Pisey

Descomentar #use_frameworks no arquivo pod e limpar os DerivedData funcionaram para mim.
Jugal Desai

2

Eu tive o mesmo problema e vim aqui para tentar descobrir o que aconteceu. Notei que a resposta mais votada e a resposta em si não me ajudaram, pois o IBDesignable não existia na pasta de log e eu já tentei todas as outras opções lá, no entanto, nos comentários, notei alguém falando sobre um init de quadro.

Decidi tentar comentar minha extensão do IBDesignable para o UIView e ele corrigiu o problema instantaneamente. Portanto, para corrigir isso, localize a extensão que está causando o problema e configure as unidades necessárias criando uma classe IBDesignable e fornecendo os inicializadores necessários da seguinte maneira:

@IBDesignable class RoundedView: UIView {

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

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

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

IMPORTANTE: lembre-se de adicionar a nova classe ao item em que você está usando o design.


1
Como diz a documentação, não se esqueça de chamar super.prepareForInterfaceBuilder () na sua implementação de prepareForInterfaceBuilder ().
Jaime S

1

Mesmo erro: havia customizado o UITextField e usando o construtor de interface, o erro no console era -Uso do inicializador não implementado 'init (frame :)' para a classe "CustomField"

Adicionado o inicializador para corrigir o erro


1

Eu enfrentei esse problema após a atualização para a versão mais recente do XCode. Depois de tentar várias soluções descritas acima, eu apenas utilizei o Xcode e desliguei o sistema, ligue-o e funcionou para mim.


0

Depois de fazer as alterações necessárias, altere o storyboard ou, no meu caso, um .xib para abrir no "XCode 7", salve e feche. Essa é apenas uma medida para eliminar os erros, mas você precisará corrigi-los ou fazer isso até não conseguir mais.


0

No meu caso, eu estava usando uma biblioteca que estava subclassificando UIView. Estava usando IB_DESIGNABLEe faltou uma chamada para[super awakeFromNib] . Depois de adicionar a chamada a esse método, o bug desapareceu.

Não tenho certeza se o fato de estar implementando IB_DESIGNABLEteve um impacto nisso.


Onde você adicionou o código para [super awakeFromNib]? Você pode compartilhar seu código?
TheJeff

0

Esta é a maneira mais fácil para mim: adicione este script ao seu Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

Fonte:

Esta solução alternativa para @IBDesignable pode ser encontrada aqui: https://github.com/CocoaPods/CocoaPods/issues/5334

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.