Aviso do Xcode Storyboard: itens de referência de restrição desativados na configuração atual. Desative essa restrição na configuração atual

146

Este aviso acontece no Xcode 6.1. Alguém tem ideias sobre o que esse aviso significa e o que acontecerá com ele? Muito Obrigado!

Abaixo está uma captura de tela com os avisos abertos no código-fonte "

insira a descrição da imagem aqui

Como descobrir qual restrição causa o aviso? O Xcode não informa qual restrição é o problema.

insira a descrição da imagem aqui

Zhihao Yang
fonte
@ wumm sim, o aplicativo pode ser construído e executado com sucesso, só estou preocupado que alguns problemas em potencial possam acontecer de alguma forma, que ainda não encontrei.
Zhihao Yang 27/10
7
Observe que, em geral, esse problema é causado por: você tem um item que não está instalado, mas possui restrições que ainda estão instaladas. Em geral, encontre o item não instalado e, para todas as suas restrições, marque-o como não instalado.
Fattie
@Fattie Por favor, edite a resposta aceita com este motivo principal. Obrigado
Milan Kamilya

Respostas:

431

Este aviso pode ser irritante e acontece a partir do Xcode 6.1.1. O principal problema é que você não pode encontrar facilmente a restrição referenciada clicando no aviso. Eu acho que isso é um bug e será corrigido mais cedo ou mais tarde.

Entretanto, enquanto isso, você pode usar esta pequena solução alternativa:

Etapa 1: detectar aviso irritante 😱

Aviso irritante

Etapa 2: Clique com o Reveal in Logbotão direito / Ctrl pressionado no aviso, selecione

insira a descrição da imagem aqui

Etapa 3: admire a beleza do seguinte snippet de log:

... snip ...
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:Dlb-cb-nWC: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:6Ze-mO-v5N: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:9av-xw-u1o: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:RPt-Uf-vaZ: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:Rnc-4M-7jV: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:epJ-D9-KEF: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
/Devel/MyCrippledAppNG/MyCrippledApp/Main_iPad.storyboard:4HC-Gu-01w: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.
... snip ...

Hmmm ... O que é isso ...?

interessante

Etapa 4: jogue isso na barra de pesquisa do projeto ... 😐

procurar

Ep Sim, você adivinhou certo. Clique.

Etapa 5: 😁 OMG! Desfrute de alguns minutos extras de produtividade até a Apple corrigir esse bug irritante. 😎

wheeee


Para 2016 ...

  • Se você não conseguir obtê-lo com 'Revelar no log', mostre o Navegador de relatórios. (Essa é a guia mais à direita na coluna mais à esquerda.) Mergulhe nos resultados da compilação lá. Isso mostrará o log de compilação, incluindo o ID da restrição. cortesia buildsucceeded

insira a descrição da imagem aqui

insira a descrição da imagem aqui

  • Observe que, para o Xcode de 5/2016, é irritante que você saia e reinicie o Xcode para limpar esse aviso em alguns casos.

  • Observe que, de maneira confusa, o mesmo erro pode ser causado por um problema não relacionado (este parece ser um bug da Apple ou um uso inadequado da linguagem do erro): se você possui IBInspectableitens e os renomeia em seus arquivos Swift. O Xcode não exclui o nome antigo UserDefinedRuntimeAttributes para você. Basta clicar em "Identity Inspector" (item 3 no painel direito) e excluir os itens defeituosos.

Para 2017 ...

  • Mais uma causa comum, e até mais simples, do problema. Se você passou a un-instalar um item: Como na escrita, muito simplesmente Xcode não sabe também automaticamente desinstalar quaisquer constrangimentos que levam a esse item . Simplesmente, observe todos os itens não instalados e, para todas as restrições, marque-os como não instalados. (Ou simplesmente, talvez apenas exclua temporariamente o item não instalado por completo, para ver se esse é o problema.)
BastiBen
fonte
28
Essa explicação foi incrível. Obrigado!
Thomasmalt 17/01
7
Minha resposta favorita da semana :) E muito útil. Obrigado!
5hrp
5
Acho que emojis devem ser solicitados em respostas a partir de agora.
James Webster
3
E se Reveal in Log estiver acinzentado como no meu caso?
bakalolo
6
Meu botão direito do mouse -> Reveal Log não estava fazendo nada, então eu abri logs usando isso como ref: stackoverflow.com/questions/19014359/…
terrigenus
39

Esta mensagem é acionada quando você desativa uma exibição no storyboard, mas não desativa as restrições com base nessa exibição.

Por exemplo, você desativou um botão, mas ainda possui algumas restrições vinculadas a esse botão. Pode ser uma restrição intrínseca, como altura ou largura, ou uma restrição relativa, como a distância de outra visualização.

Você precisa desativar cada uma das restrições que referenciam a exibição e precisa fazê-lo manualmente. O Xcode está sendo excessivamente conservador aqui e não fará isso por você.

KPM
fonte
4
Obrigado por sua resposta! Você poderia torná-lo mais específico, o que é "uma exibição desativada"? É para excluir uma visualização (como um botão)? mas como eu já a excluí, a restrição também pode ser excluída e não pôde ser encontrada? E como "desativar a restrição" em mais detalhes, basta selecionar e excluí-lo? Muito obrigado!
Zhihao Yang
2
Se uma exibição não estiver marcada como "Instalada" no Interface Builder para sua classe de tamanho atual, ela será desativada.
DivideByZer0
Eu tenho muitos ViewControllers no meu storyboard. ¿Como sei qual possui uma subvisão não instalada?
jobima 21/10
você pode clicar com o botão direito do mouse no aviso e selecionar a opção "Código-fonte". Lá, você deve ver claramente a hierarquia da vista correspondente no controlador de vista respeitado.
ZaEeM ZaFaR
15

Esta solução funciona para mim.

Como copiei vários itens do projeto que desenvolvi no Xcode 5 para o Xcode 6, e o storyboard no Xcode 6 suporta vários layouts, para cada restrição, preciso instalá-lo na configuração atual.

Por exemplo, estou usando "Largura compacta | Altura regular", para a restrição que preciso definir como abaixo:

insira a descrição da imagem aqui

Depois de verificar e definir todas as centenas de restrições em meus projetos, limpar e construir, os avisos finalmente desaparecem.

Zhihao Yang
fonte
1
Observe que também existem essas Installedcaixas de seleção incômodas nos atributos de seu objeto de exibição. Portanto, verifique se os objetos de exibição que você acha que estão sendo exibidos têm a caixa de seleção correta marcada. O aviso está informando que alguns objetos não estão sendo exibidos no current configuration.
Matt
Isso funcionou para mim também. O XCode disse que eu tinha 12 ou 13 avisos, mas procurar no log por um deles mostrou que havia pelo menos 100. Então, eu examinei cada um deles, adicionando um wChR para cada restrição e desmarcando o genérico 'Instalado'. Os avisos desapareceram!
Andreas
Ah, esqueci de mencionar. Percebi na metade do caminho que você pode realmente executar esse processo para várias restrições ao mesmo tempo, selecionando-as ao mesmo tempo.
Andreas
8

Só queria adicionar meu caso como esse erro aconteceu comigo: no meu caso, eu queria excluir um campo de texto com "Cmd + Backspace". Fiz isso diretamente na Scene-Builder Tree-View:

insira a descrição da imagem aqui

Você pode ver que o campo de repetição está acinzentado.

Então isso foi facilmente descoberto para mim. Você pode simplesmente excluir o campo selecionando:

Editar-Excluir no menu

Surpreendentemente - isso realmente exclui o campo (incluindo as restrições). Talvez isso ajude alguém a encontrar facilmente a causa desse aviso irritante ...

Dirk
fonte
Isso realmente não responde à pergunta. Se você tiver uma pergunta diferente, faça-a clicando em Fazer pergunta . Você também pode adicionar uma recompensa para chamar mais atenção para essa pergunta quando tiver reputação suficiente . - Do comentário
Martin Evans
3
Essa é outra maneira de corrigir a pergunta. Então, só queria adicionar isso para ajudar os outros ...
Dirk
Obrigado, muito útil
Ahmed Elashker
Esta resposta foi resumida em como encontrar e corrigir o problema. Funcionou para mim!
Lance Samaria
6

Explicação expandida

Nada de errado com as outras respostas. Eu só queria chamar a atenção para as palavras do aviso original e identificar alguns casos de uso em que isso pode aparecer no fluxo de trabalho.

aviso de restrição

Itens de referência de restrição desativados na configuração atual.

Significa que algum item (geralmente um controle ou exibição personalizada normalmente visível) referenciada em uma ou mais restrições está desativado (desabilitado ou com a caixa de seleção "instalada" desmarcada). Se, por exemplo, você decidir mover um controle ou exibição no seu storyboard para fora da exibição principal (ou às vezes, ao fazer algo interessante nas classes de tamanho), poderá receber este aviso se o controle tiver restrições associadas a ele .

controle desinstalado

Juntamente com a solução recomendada:

Desative essa restrição na configuração atual.

Duas abordagens para corrigir

Esboço do Documento

Visualmente, você pode abrir o Esboço do Documento no seu storyboard e procurar as Restrições acinzentadas que referenciam seu controle / visualização fora da vista principal (amplie o contorno, clique na restrição e visualize o inspetor de atributos, clique com o mouse para baixo para revisar rapidamente) . Em seguida, remova a restrição desse contexto (classe de tamanho). Por exemplo, no meu caso, estou apenas mantendo o controle até decidir mais tarde onde apresentá-lo, então escolhi excluir completamente a restrição ofensiva até mais tarde. Mas em uma classe de tamanho, eu apenas desinstalaria a restrição do contexto atual usando a caixa de seleção instalada no inspetor de atributos.

Navegador de registro / Ferramenta de localização

Também é possível continuar usando o Log Navigator para encontrar o controle de problemas por meio do identificador exclusivo dado a cada objeto no storyboard. No log, seria um pouco antes do texto destacado em amarelo e normalmente assume o formulário como visto no meu exemplo acima: jvj-mY-DHf

Usando o identificador, é possível usar a ferramenta de localização no Xcode para localizar e excluir (completamente) ou desinstalar (para o contexto atual) a restrição ofensiva.

navegador de log

Se você gosta do Xml e de sua simplicidade, também pode abrir o Storyboard como código-fonte e encontrar o identificador exclusivo ofensivo e excluir o bloco apropriado de xml.

Tommie C.
fonte
1

Uma das razões pelas quais isso pode acontecer é porque você selecionou uma classe de tamanho incompatível com suas restrições ( wAny hAnyé um caso comum). Nesse caso, basta selecionar uma classe de tamanho diferente no Interface Builder e pronto.

Jano
fonte
1

Para mim, isso acontece se eu definir um objeto para uma nova contraint (não para exibir) com a opção "Restringir para margens" não marcada. Problema resolvido com marque a opção (que é o padrão).

Ryde
fonte
1

O que funcionou para mim (e eu não tenho idéia do porquê) é desativar "Usar variações de características", executar uma limpeza e ligá-las novamente. A próxima compilação não teve avisos.

Para desativar "Usar variações de características", basta selecionar seu storyboard no Project Navigator e, em seguida, selecionar File Inspector.

insira a descrição da imagem aqui

Em seguida, basta desmarcar a opção "Usar variações de características", executar a limpeza pressionando Shift-CMD K e, em seguida, reativar as variações de características, se desejar usá-las.

insira a descrição da imagem aqui

Lambreta
fonte
Eu não acho que isso seja "correto" por si só (as restrições desaparecem), no entanto, essa resposta foi útil para mim, porque assim que eu brincava com essa opção e depois revertia as alterações para a última confirmação, o Xcode atualizava perfeitamente qualquer erro antigo / incorreto / já corrigi avisos desse tipo. Parece que o Xcode mostraria avisos antigos, já corrigidos, na maioria das vezes - reiniciar o Xcode normalmente não ajudaria para mim. Pressionar esse botão + restaurar para a última confirmação parece mostrar o próximo aviso "real" desse tipo; clicar nele selecionaria automaticamente a restrição problemática no IB.
Jonny
0

Eu pensei que era uma restrição persistente devido à outra resposta, no entanto, era devido a uma 'saída' que eu ainda tinha para um item que eu excluí antes. O que fazer é:

  1. Selecione seu ViewController
  2. Clique no ícone 'outlet' no canto superior direito
  3. Examine suas tomadas e exclua com cuidado as que você não precisa

No pior cenário, você exclui todas as suas tomadas e as conecta novamente. Caso resolvido!

Risadas
fonte
0

Como mencionado e bem orientado na resposta do @ BadCat , segui os passos e apenas mais um passo que ousei dar!

Etapas a serem seguidas após a última etapa da resposta do BadCats:

Passo 1:

Selecionei a restrição no Interface Builder e depois lembrei disso para que serve e depois a excluí.

Passo 2

Crie o projeto XCode e ele mostrará que você pode ter aumentado o número de avisos. Isso ocorre porque você excluiu uma restrição que precisa compilar bem. Então, vá para o 3º passo!

etapa 3

Adicione novamente a restrição que você lembrou (a que você excluiu). E depois reconstrua-o novamente!

Para mim, os avisos desapareceram apenas fazendo isso! Eu acho que isso vai funcionar para algumas pessoas!

Causa:

Como eu pude entender o problema que causou esse aviso, eu tinha um Label conectado a um IBOutlet, mas seu nome estava começando com uma letra maiúscula. Então, eu o renomeei com uma letra simples no ViewController e vim alterá-lo no IB. Eu removi o IBOutlet anterior e fui conectá-lo ao nome da propriedade recém-renomeado e conectado. Então eu notei que há um novo aviso.

Primeiro eu tentei a seguinte resposta também neste tópico, mas não ajudou!

Felicidades!

Randika Vishman
fonte
0

Meu caso é escolher o rótulo e, em seguida, clique em Control + X, ele será desativado, mas eu não faço nada com ele. Quando eu construir, ele mostrará um aviso. Solução: remova a etiqueta ou remova o controle escolhido + X para a etiqueta.

Duyen Hang Kim
fonte
0

Excluo todos esses elementos da interface do usuário, incluindo suas restrições, e os adiciono novamente, esses avisos simplesmente desaparecem. De qualquer forma, esta é uma maneira pior, mas útil, de resolver isso.

Antigo
fonte
0

Eu tive o problema em uma exibição de pilha. Excluir as restrições e adicioná-las novamente não ajudou. A limpeza e a reconstrução não ajudaram.

Para mim, a solução foi criar um objeto de exibição de pilha completamente novo.

Em seguida, mova todos os elementos da exibição antiga da pilha para a nova exibição da pilha.

A exclusão da exibição antiga da pilha corrigiu o problema.

George Filippakos
fonte