58 votes

Comment éviter les modifications gratuites des fichiers de storyboard par Xcode ?

Lorsque je navigue vers un de mes fichiers xib, Xcode marque le fichier comme touché. Undo et revert n'ont aucun effet. Sauvegarder semble ne pas faire de mal, mais le problème me cause un travail supplémentaire fréquent sur git.

Quelqu'un d'autre a-t-il vu cela ou a-t-il une idée sur quelque chose dans mon MainWindow.xib qui pourrait en être la cause ?

Édition en 2019 - toujours d'actualité !

0 votes

Je ne vois pas ce comportement dans mon environnement. Je me demande : Se pourrait-il que le xib en question ait été utilisé pour la dernière fois dans Xcode3, et que Xcode 4 effectue une conversion dans les coulisses ? Ou bien, voyez-vous cela chaque fois que vous sélectionnez un fichier xib, que ce soit la première fois que vous le sélectionnez dans Xcode4 ou non ? Y a-t-il des paramètres git où votre fichier est en lecture seule et peut-être Xcode change-t-il les permissions pour que vous puissiez le modifier ? Cela pourrait expliquer le statut modifié.

0 votes

Merci pour ces idées. Le fichier se trouvait dans un projet xcode 3. Le problème se produit chaque fois que je navigue vers ce seul fichier . Votre idée de conversion est bonne, mais le problème persiste même après une sauvegarde/construction. Pas de paramètres git spéciaux.

2 votes

Voici les étapes minimales avec lesquelles je peux reproduire ce problème : xcode->Nouveau fichier...->Interface utilisateur->Application xib. Faites glisser un contrôleur de barre d'onglets. Sauvegarder. Sélectionnez n'importe quel autre fichier dans le projet. Le nouveau xib est touché par xcode. Diffuser l'original avec les mods de xcode montre un tas de tags comme celui-ci : <reference key="NSWindow"/> et <reference key="IBUITabBar" ref="795333663"/> et un très gros bloc qui s'ouvre comme ceci : <objet class="NSMutableArray" key="referencedPartialClassDescriptions">. Suis-je fou ?

30voto

danh Points 21498

Apple dit que c'est un problème connu :

Il s'agit d'un suivi du bogue ID# 9847336. Après une enquête plus approfondie, il a été déterminé qu'il s'agit d'un problème connu, qui est actuellement examiné par l'ingénierie. Ce problème a été enregistré dans notre base de données de bogues sous le numéro d'identification de bogue original 9056156. Le numéro de bogue original utilisé pour suivre ce problème dupliqué peut être trouvé dans la colonne État, dans ce format : Duplicate/OrigBug#.

2 votes

Je ne vois pas comment les développeurs d'Apple ne seraient pas agacés au point de l'avoir déjà corrigé.

0 votes

Quelqu'un d'autre peut-il confirmer ? Je ne vois plus le problème dans la version 5.0 (5A1413). Hourra ?

1 votes

Je peux encore le voir à 100% dans XCode 4.6.3, octobre 2013 !

14voto

Adam Eisfeld Points 221

Après avoir essayé de nombreuses solutions différentes pour contourner ce bug extrêmement ennuyeux, j'ai trouvé une méthode qui fonctionne (ce n'est certainement pas un "correctif", mais une solution de contournement).

Verrouillez les contrôleurs lorsque vous avez fini de les utiliser.

Sélectionnez un contrôleur de vue dans un storyboard, ouvrez l'inspecteur d'identité et, en bas de la section Document, vous verrez une liste déroulante Verrouillage. Sélectionnez "Toutes les propriétés" dans la liste déroulante de verrouillage.

Si vous faites cela pour tous les contrôleurs qui vous posent problème (ou pour tous les contrôleurs en général, même), vous remarquerez que lorsque vous ouvrez le storyboard, Xcode modifie toujours les images des différents éléments, mais annule immédiatement les changements.

Cela conduit ensuite à ce que le cycle de développement soit :

  1. Déverrouiller un contrôleur de vue
  2. Effectuer les changements nécessaires
  3. Verrouiller le contrôleur de vue
  4. Engagez-vous

Le verrouillage fonctionne également sur la base d'une vue par vue si cela répond mieux à vos besoins.

Ce bogue existe depuis un certain temps déjà et ne semble pas vouloir être corrigé de sitôt. Malheureusement, il faudra s'en contenter pour l'instant.

0 votes

Oh mec, j'étais tellement excité de trouver cette solution de contournement. Ce bug m'a tourmenté et frustré pendant 4 mois. Hélas, Xcode 6.2 se plante si je verrouille toutes les propriétés sur le contrôleur de vue. J'ai même essayé de déplacer le verrouillage jusqu'à la vue Root, mais ça plante toujours à chaque fois. Dang. Content que vous ayez réussi à le faire fonctionner !

3voto

mikeho Points 310

Je pense personnellement que le fait de savoir qu'il s'agit d'un bogue connu ne résout pas vraiment le problème. Voici ce que j'ai découvert jusqu'à présent et comment les empêcher de se manifester.

NOTE : Ceci est pour un storyboard avec AutoLayout activé. Je n'ai pas encore trouvé de solution pour les storyboards manuels.

Vous trouverez ci-dessous un exemple de bouton.

<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>

Si vous jetez un coup d'oeil, vous verrez que le bouton a un élément appelé <rect/> Cela définit la taille et la position de l'élément de l'interface utilisateur. Si vous regardez ci-dessous, vous verrez également un élément appelé <variation/> qui décrit le changement de position en fonction de la classe de taille. Afin de fixer la position, nous devons suivre les étapes suivantes :

  1. Regardez l'avertissement qui s'affiche dans Xcode. Prenez note de ce qui doit être modifié pour cet élément de l'interface utilisateur.
  2. Ouvrez le storyboard dans un éditeur externe (texte).
  3. Trouvez l'élément d'interface utilisateur dans le storyboard.
  4. Modifiez la valeur pour qu'elle corresponde à ce que l'avertissement suggère dans les deux cas. <rect/> et <variation/> .
  5. Enregistrez le fichier dans l'éditeur externe.
  6. Retournez dans Xcode. Laissez-le recalculer toutes les contraintes.
  7. Acceptez l'avertissement pour l'élément d'interface utilisateur qui apparaît à nouveau.
  8. Si vous revenez à l'éditeur externe, vous remarquerez que l'élément <variation/> L'élément est parti.

Dans mon exemple, j'ai dû mettre à jour x="97" à x="597" .

Je travaille encore sur les éléments qui n'ont pas de nom de domaine. <variation/> . Je mettrai à jour cette réponse dès que j'aurai trouvé la solution.

0 votes

Xcode modifie les ID et les autres éléments de manière aléatoire, il ne s'agit pas seulement de contraintes de vue et de positions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X