Após Xcode 11.2: aplicativo trava devido a _UITextLayoutView — solução

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Após atualizar o Xcode 11.2 o aplicativo trava: como vencer o _UITextLayoutView

\n\n

Acontece: você está trabalhando tranquilamente no projeto, tudo voa, os testes passam, os usuários estão satisfeitos. E então — puf! — você atualiza o Xcode para a versão 11.2, inicia o aplicativo, e ele trava com um erro misterioso _UITextLayoutView. Familiar? Se sim — você não está sozinho. Esse problema literalmente explodiu o Stack Overflow no final de 2019 (milhares de visualizações em uma semana).

\n\n

Neste artigo, não vou apenas mostrar como corrigir esse bug, mas também explicar por que ele ocorre, como diagnosticá-lo e, principalmente, como preveni-lo no futuro. Vamos analisar tudo com exemplos reais em Swift. Vamos lá!

\n\n

Que bicho é esse _UITextLayoutView?

\n\n

Vamos começar com a teoria. _UITextLayoutView é uma classe interna (privada) do UIKit que é responsável pela renderização de texto em UITextView. A Apple não a documenta publicamente, portanto, quando algo deu errado com essa classe no Xcode 11.2, os desenvolvedores ficaram em um beco sem saída. O erro se parece com isto:

\n\n
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UITextLayoutView setFrame:]: unrecognized selector sent to instance 0x...'
\n\n

A frase-chave é "unrecognized selector sent to instance". Isso significa que você está tentando chamar o método setFrame: em um objeto que não o suporta. E como _UITextLayoutView é uma classe privada, antes do Xcode 11.2 ela se comportava de forma diferente.

\n\n

Quem está no grupo de risco?

\n\n

O problema não se manifesta em todos, mas apenas sob certas condições. Aqui está um cenário típico:

\n
    \n
  • Você está usando UITextView com o redimensionamento automático (auto-sizing) ativado.
  • \n
  • Você tem uma hierarquia de views personalizada onde UITextView está aninhado em UIScrollView ou UITableViewCell.
  • \n
  • Você interage ativamente com o campo de texto: rolando, editando, alterando a fonte.
  • \n
\n\n

Se pelo menos um item coincidir — parabéns, você está na zona de risco. Mas não se preocupe: a solução existe e é elegante.

\n\n

Passo 1: Diagnóstico — encontre o culpado

\n\n

Antes de tratar, vamos garantir que o problema é realmente o _UITextLayoutView. Abra o console do Xcode (View → Debug Area → Activate Console) e inicie o aplicativo. Se você vir um erro semelhante ao que mostrei acima — você está no caminho certo.

\n\n

Um sinal adicional: a falha ocorre na primeira tentativa de exibir o UITextView ou ao rolar dentro dele. Se o aplicativo travar imediatamente após o carregamento — provavelmente é isso.

\n\n

Passo 2: Solução simples e rápida (para quem está com pressa)

\n\n

A correção mais popular no Stack Overflow é desativar o redimensionamento automático do UITextView. Veja como fazer:

\n\n
// No seu viewDidLoad ou método de configuração\ntextView.isScrollEnabled = false\ntextView.translatesAutoresizingMaskIntoConstraints = true
\n\n

Mas atenção! Essa solução funciona, mas quebra o auto-dimensionamento do texto. Se for crucial que o UITextView mude dinamicamente de altura conforme o conteúdo — essa opção não servirá. Vamos cavar mais fundo.

\n\n

Passo 3: Solução avançada — sobrescrevendo layoutSubviews

\n\n

A Apple lançou um patch no Xcode 11.2.1, mas se por algum motivo você permaneceu no 11.2, ou quer uma solução universal, aqui está o que fazer.

\n\n

Crie uma subclasse de UITextView e sobrescreva o método layoutSubviews:

\n\n
import UIKit\n\nclass FixedTextView: UITextView {\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        // Limpa a camada de subviews extras que o bug causa\n        self.subviews.forEach { subview in\n            if subview.isKind(of: NSClassFromString("_UITextLayoutView") ?? UIView.self) {\n                

Blogs

Book Recommendations