Xcode 8. Ограничение привязки элементов, отключенных в текущей конфигурации

Я столкнулся с проблемой после обновления до Xcode 8. Каждый раз, когда объекты пользовательского интерфейса удаляются из основной раскадровки, я получаю следующее предупреждение:

Ограничение привязки элементов, отключенных в текущей конфигурации. Отключите это ограничение в текущей конфигурации.

введите описание изображения здесь

Похоже, что это ошибка Xcode, но в любом случае я хочу удалить эти предупреждения из проекта. Я обнаружил, что существует такая же проблема с Xcode 6 здесь, но ни один ответ на этот вопрос не исправит проблему. Поэтому, когда я нахожу неправильное ограничение в раскадровке и удаляю его, количество неправильных ограничений увеличивается, а не уменьшается. Я так же старался:

  • очистить проект
  • очистка полученных данных
  • удалил все ограничения и добавил новые с нуля

Любые идеи?

Ответ 1

У меня было несколько просмотров, которые не были Installed, после обновления до xcode 8.1 у меня было 2 предупреждения.

Следующие шаги работали для меня:

1) Очистите проект и перезапустите Xcode, предупреждения уменьшены до 1.

2) Выбор предупреждения покажет, какое именно ограничение имеет проблему. Откройте Attributes Inspector и выберите те виды, в которых применяется ограничение, ищите Installed, если он не отмечен в представлении (а не на ограничении). Вы можете либо выбрать "Установлено" в представлении, либо снять флажок "Установлено на самом ограничении).

Смотрите снимок экрана ниже. Installed не был просмотрен на вид, а не на том ограничении, на которое указывалось предупреждение:)

Установлено не проверено на представлении, а не на самом ограничении

Обновление: повторная проблема с другим ViewController, UIView не был установлен для класса размера, я отменил выбор Installed on constraint и предупреждение тоже исчезло, я полагаю, что это не ошибка Xcode, его требование включить Turned on/off как UIView, так и Constrarint

Ответ 2

Краткий ответ: проверьте исходный код для раскадровки для каждого из идентификаторов в ваших предупреждениях, выполнив поиск "id =" theIdFromWarning ". Иды предназначены для ограничений. Когда вы найдете идентификатор ограничения, он будет ссылаться на идентификаторы двух элементов. Поиск элементов путем поиска 'id =" theIdForElement"' Затем вы найдете имя или часть информации в этом исходном коде элемента, чтобы узнать, на какой элемент вы смотрите. Затем переключите раскадровку обратно из исходного кода в конструктор интерфейса, найдите два элемента и посмотрите, какой размерный класс связан с соответствующим ограничением, но элемент отсутствует. Пример: ViewA.right может быть ограничен горизонтально ViewB.left, установленным во всех классах размеров, но ViewA может быть установлен только в height = Regular size class. Решение: установите ViewA на всех классах размеров или удалите ограничение для всех классов размера и добавьте ограничение только к классу height = Regular size.

Более длительный ответ, шаг за шагом:

Мне не удалось легко увидеть, какие ограничения/элементы имеют эти предупреждения. Для меня я смог щелкнуть правой кнопкой мыши предупреждение и выбрать "Показать в журнале". Это выявило 10 предупреждений в этом формате стиля:

/my/filepath/to/storyboard:1xe-xx-Bx5: warning: Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration.

Если ваш журнал не показывает подробное описание, подобное этому, затем щелкните правой кнопкой мыши на любой ссылке журнала на Constraint referencing items turned off in current configuration. Turn off this constraint in the current configuration. предупреждение и выберите Expand all transcripts, затем выполните поиск в файле журнала для описания ограничений.

Итак, я открыл свою раскадровку, щелкнул правой кнопкой мыши файл раскадровки в навигаторе проекта и выбрал "просмотр как исходный код" для поиска каждого ограничения указанным идентификатором (в приведенном выше примере я искал идентификатор: 1xe-xx-Bx5), и нашел одну ссылку на него:

<constraint firstItem="Mwb-6O-DKs" firstAttribute="top" secondItem="y2M-Sk-Ygh" secondAttribute="bottom" constant="19" id="1ce-xx-Bx5"/>

Что это говорит мне:

  • Что ограничение имеет идентификатор 1ce-xx-Bx5
  • Ограничение связано с двумя элементами:
  • У одного есть идентификатор Mwb-6O-DKs
  • Другой имеет идентификатор y2M-Sk-Ygh

Итак, я искал исходный код для первого элемента по id, ища id="Mwb-6O-DKs" и нашел это:

<label ...(truncating for readability sake)...text="Build Label"...(truncating for readability sake)...id="Mwb-6O-DKs">

Это говорит мне, что первым элементом является UILabel с заголовком 'Build Label'.

Поиск второго элемента по id, id="y2M-Sk-Ygh", показало:

<viewController storyboardIdentifier="login"...(truncating for readability sake)...<layoutGuides><viewControllerLayoutGuide type="top" id="y2M-Sk-Ygh"/>

Итак, я полагаю, это означает, что UILabel с текстом "Build Label" имеет верхнее ограничение, которое отключено. (так как ограничение viewControllerLayoutGuide никогда не должно быть отключено, оно должно быть UILabel.

Ло, и вот, он не был установлен. Я выбрал флажок Installed для UILabel, и ошибка исчезла.

1 вниз, еще 9! (F * ing Xcode...)

Ответ 3

Показать Report Navigator [Это самая правая вкладка в крайнем левом столбце]. Это покажет журнал построения с идентификаторами ограничений. Более подробную информацию можно найти в postoverflow post.

Ответ 4

У меня было мнение, что я удалился, чтобы появилось предупреждение. После переустановки просмотра предупреждение не исчезло даже после чистки. Но после перезапуска Xcode предупреждение исчезло.

Ответ 5

Причина

У вас есть элемент (т.е. вид), который не установлен, но он имеет ограничения, которые все еще установлены. (прокомментирован fattie)

Как узнать конкретное ограничение

Трудно найти точное ограничение, которое вызывает это предупреждение. Он упомянул шаг за шагом в ответе BastiBen, как узнать конкретное ограничение.

Решение

  • Проверьте оба элемента/представления (первый и второй) конкретного ограничения на то, что какой-либо элемент не установлен для любого определенного класса размера. В моем случае ограничение было установлено для всех размерных классов, но один из элементов был установлен для "wC hR" (см. Следующее изображение). введите описание изображения здесь
  • Установите элемент, чтобы разрешить предупреждение.
  • Теперь создайте приложение, если вы все еще найдете одно и то же предупреждение для этого конкретного интерфейса/файла XIB, не волнуйтесь, на этот раз некоторые другие ограничения имеют одинаковую проблему.

Совет для будущего

  • Пожалуйста, проверьте, правильно ли установлены представления при копировании и вставке их из других интерфейсов.

Ответ 6

Вы также можете найти представление или ограничение, посмотрев на тег в источнике раскадровки.

  1. Откройте раскадровку как источник
  2. Ищите следующий тег, чтобы получить идентификатор
  3. Ищите идентификатор в раскадровке, чтобы найти, какой это элемент.

Ответ 7

Решением было просто удалить удаленные представления. Просто как это.

Ответ 8

Для решения этой проблемы есть несколько вариантов:

Во-первых, что вызывает проблему? Удаление представления без удаления ограничений.

Во-вторых, зачем тебе это? Возможно, вы захотите, чтобы представление осталось в вашем контроллере представления, потому что вы его создали, а затем изменились спецификации, поэтому вы хотели временно удалить его, потому что, возможно, эта часть не была включена в ваш текущий спринт или что у вас есть

Последний, как можно решить?

Есть три варианта:

  1. Если вы можете просто переустановить вид

  2. Если вы хотите сохранить вид

  3. Если вы можете просто удалить все неустановленные представления

Вариант 1

Если вы можете просто переустановить вид:

  1. Переустановите вид, переключив установленный параметр, как показано на рисунке 2, в любом представлении, которое исчезло, как показано на рисунке 1

  2. Попробуйте очистить проект (Command + Shift + K) - если это не сработает, попробуйте перезапустить xCode. Если это не работает, возможно, вы пропустили неустановленное представление.

Вариант 2

Если вы хотите сохранить вид:

  1. Найдите все представления в вашей системе контроллеров представлений, которые исчезли (это означает, что они были удалены)

1 enter image description here2 enter image description here

  1. Посмотрите на ограничения, связанные с представлением

3enter image description here

  1. Снимите флажок "Установлено"

Ограничение теперь также будет исчезать (не группа ограничений), как показано на первом рисунке.

  1. Попробуйте очистить проект (Command + Shift + K) - если это не сработает, попробуйте перезапустить xCode. Если это не сработает, возможно, вы где-то пропустили ограничение.

Вариант 3

Если вы можете просто удалить все неустановленные представления

  1. Удалите все виды, которые были удалены, что автоматически удалит их ограничения

  2. Очистите проект (Command + Shift + K), если это не работает, попробуйте перезапустить xCode.

Ответ 9

По сути, убедитесь, что вы "удалили" все ограничения для "неустановленных" представлений/кнопок/и т.д.