Как избежать бесполезного редактирования XCode в файлах раскадровки?
Когда я перемещаюсь к одному из моих файлов XIB, XCode отмечает файл как затронутый. Отмена и возврат не имеют никакого эффекта. Сохранение, кажется, не приносит вреда, но сбой вызывает у меня частые дополнительные мерзавцы
Кто-нибудь еще видел это или имел представление о чем-то в моем MainWindow.xib, что могло бы вызвать это?
Редактировать в 2016 году - все еще происходит!
3 ответа
Apple говорит, что это известная проблема:
Это продолжение идентификатора ошибки № 9847336. После дальнейшего расследования было установлено, что это известная проблема, которая в настоящее время исследуется с помощью технических средств. Эта проблема была зарегистрирована в нашей базе данных ошибок с исходным идентификатором ошибки # 9056156. Оригинальный номер ошибки, используемый для отслеживания этой повторяющейся проблемы, можно найти в столбце "Состояние" в следующем формате: Duplicate/OrigBug#.
Попытавшись найти множество различных решений, чтобы обойти эту чрезвычайно раздражающую ошибку, я нашел один метод, который работает (это, конечно, не "исправление", а обходной путь).
Блокировка контроллеров, когда вы закончите с ними.
Выберите контроллер представления в раскадровке, откройте инспектор удостоверений и в нижней части раздела "Документ" вы увидите раскрывающийся список "Блокировка". Выберите "Все свойства" из выпадающего списка блокировки.
Если вы сделаете это для всех контроллеров, создающих проблемы (или даже для всех контроллеров в целом, даже), вы заметите, что при открытии раскадровки Xcode по-прежнему будет изменять кадры различных элементов, но затем немедленно отменяет изменения.
Это приводит к тому, что цикл разработки будет:
- Разблокировать вид контроллера
- Выполните любые необходимые изменения
- Блокировка контроллера вида
- совершить
Блокировка также работает для каждого отдельного случая, если это лучше соответствует вашим потребностям.
Ошибка существует уже довольно давно, и в ближайшее время она, похоже, не будет исправлена, поэтому, к сожалению, этого пока будет достаточно.
Я лично чувствую, что зная, что это известная ошибка, не совсем решает проблему. Вот что я выяснил до сих пор и как предотвратить их появление.
ПРИМЕЧАНИЕ: это для раскадровки с включенной AutoLayout. Я еще не понял это для ручных раскадровок.
Ниже приведен пример кнопки.
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ebd-ny-Ill">
<rect key="frame" x="97" y="5" width="135" height="30"/>
<color key="backgroundColor" white="0.94557291669999999" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" constant="86" id="bXV-mS-ksp">
<variation key="heightClass=regular" constant="135"/>
</constraint>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<state key="normal" title="See Full Menu">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<variation key="default">
<mask key="constraints">
<exclude reference="bXV-mS-ksp"/>
</mask>
</variation>
<variation key="heightClass=regular" misplaced="YES">
<rect key="frame" x="97" y="5" width="135" height="28"/>
<mask key="constraints">
<include reference="bXV-mS-ksp"/>
</mask>
</variation>
<connections>
<action selector="showMenu:" destination="eQk-yf-uDh" eventType="touchUpInside" id="xOP-Se-FXQ"/>
</connections>
</button>
Если вы посмотрите, вы увидите, что кнопка имеет элемент под названием <rect/>
Это определяет размер и положение элемента пользовательского интерфейса. Если вы посмотрите ниже, вы также увидите элемент под названием <variation/>
который описывает изменение положения на основе класса размера. Чтобы исправить положение для этого, мы должны использовать следующие шаги:
- Посмотрите на предупреждение, которое появляется в Xcode. Обратите внимание на то, что необходимо изменить для этого элемента пользовательского интерфейса.
- Откройте раскадровку во внешнем (текстовом) редакторе.
- Найдите элемент пользовательского интерфейса в раскадровке.
- Измените значение в соответствии с тем, что предлагает предупреждение в обоих
<rect/>
а также<variation/>
, - Сохраните файл во внешнем редакторе.
- Вернитесь к Xcode. Пусть он пересчитает все ограничения.
- Примите предупреждение для элемента пользовательского интерфейса, который снова появляется.
- Если вы вернетесь во внешний редактор, вы заметите, что
<variation/>
элемент ушел.
В моем примере мне пришлось обновить x="97"
в x="597"
,
Я все еще работаю над элементами, которые не имеют <variation/>
, Я обновлю этот ответ, как только выясню.