Как избежать бесполезного редактирования XCode в файлах раскадровки?

Когда я перемещаюсь к одному из моих файлов XIB, XCode отмечает файл как затронутый. Отмена и возврат не имеют никакого эффекта. Сохранение, кажется, не приносит вреда, но сбой вызывает у меня частые дополнительные мерзавцы

Кто-нибудь еще видел это или имел представление о чем-то в моем MainWindow.xib, что могло бы вызвать это?

Редактировать в 2016 году - все еще происходит!

3 ответа

Решение

Apple говорит, что это известная проблема:

Это продолжение идентификатора ошибки № 9847336. После дальнейшего расследования было установлено, что это известная проблема, которая в настоящее время исследуется с помощью технических средств. Эта проблема была зарегистрирована в нашей базе данных ошибок с исходным идентификатором ошибки # 9056156. Оригинальный номер ошибки, используемый для отслеживания этой повторяющейся проблемы, можно найти в столбце "Состояние" в следующем формате: Duplicate/OrigBug#.

Попытавшись найти множество различных решений, чтобы обойти эту чрезвычайно раздражающую ошибку, я нашел один метод, который работает (это, конечно, не "исправление", а обходной путь).

Блокировка контроллеров, когда вы закончите с ними.

Выберите контроллер представления в раскадровке, откройте инспектор удостоверений и в нижней части раздела "Документ" вы увидите раскрывающийся список "Блокировка". Выберите "Все свойства" из выпадающего списка блокировки.

Если вы сделаете это для всех контроллеров, создающих проблемы (или даже для всех контроллеров в целом, даже), вы заметите, что при открытии раскадровки Xcode по-прежнему будет изменять кадры различных элементов, но затем немедленно отменяет изменения.

Это приводит к тому, что цикл разработки будет:

  1. Разблокировать вид контроллера
  2. Выполните любые необходимые изменения
  3. Блокировка контроллера вида
  4. совершить

Блокировка также работает для каждого отдельного случая, если это лучше соответствует вашим потребностям.

Ошибка существует уже довольно давно, и в ближайшее время она, похоже, не будет исправлена, поэтому, к сожалению, этого пока будет достаточно.

Я лично чувствую, что зная, что это известная ошибка, не совсем решает проблему. Вот что я выяснил до сих пор и как предотвратить их появление.

ПРИМЕЧАНИЕ: это для раскадровки с включенной 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/> который описывает изменение положения на основе класса размера. Чтобы исправить положение для этого, мы должны использовать следующие шаги:

  1. Посмотрите на предупреждение, которое появляется в Xcode. Обратите внимание на то, что необходимо изменить для этого элемента пользовательского интерфейса.
  2. Откройте раскадровку во внешнем (текстовом) редакторе.
  3. Найдите элемент пользовательского интерфейса в раскадровке.
  4. Измените значение в соответствии с тем, что предлагает предупреждение в обоих <rect/> а также <variation/>,
  5. Сохраните файл во внешнем редакторе.
  6. Вернитесь к Xcode. Пусть он пересчитает все ограничения.
  7. Примите предупреждение для элемента пользовательского интерфейса, который снова появляется.
  8. Если вы вернетесь во внешний редактор, вы заметите, что <variation/> элемент ушел.

В моем примере мне пришлось обновить x="97" в x="597",

Я все еще работаю над элементами, которые не имеют <variation/>, Я обновлю этот ответ, как только выясню.

Другие вопросы по тегам