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

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

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

Изменить в 2016 году - все еще происходит!

Ответ 1

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

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

Ответ 2

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

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

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

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

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

  • Разблокировать контроллер вида
  • Выполните необходимые изменения.
  • Блокировка контроллера просмотра
  • Фиксировать

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

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

Ответ 3

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

ПРИМЕЧАНИЕ. Это для раскадровки с включенным автозапуском. Я еще не понял его для ручных раскадровки.

Ниже приведен пример кнопки.

<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/>. Я обновлю этот ответ, как только узнаю.