ios - features - Xcode cambia el guión gráfico sin modificar y los archivos XIB
xcode ios 12 (5)
Los guiones gráficos son más bien un dolor real desde una perspectiva de flujo de trabajo de git cuando varias personas colaboran en ellos. Por ejemplo, el XML en el archivo .storyboard tiene sus atributos toolsVersion
y systemVersion
la etiqueta <document>
de toolsVersion
alterados por la configuración que esté ejecutando el manipulador de archivos más reciente. Sincronizar las versiones de Xcode de todo el mundo parece ayudar precisamente con toolsVersion
, pero systemVersion
cambia sin importar qué, dependiendo de la versión específica de Mac y / o OS X que el desarrollador esté ejecutando.
Esto es idiota, pero sobre todo inofensivo. Sin embargo, lo que nos preocupa es que en otras ocasiones se realizan automáticamente otros cambios al guión simplemente abriéndolos después de un git pull
. Es decir, Alice realiza cambios en un guión gráfico, los compromete y los empuja al repositorio. Luego Bob saca los cambios de Alice y abre el guión gráfico para hacer más cambios. En el momento en que abre el guión gráfico, el ícono de archivo cambia inmediatamente a un estado modificado pero no guardado, y un git status
muestra que ha ocurrido cualquier cantidad de cambios extraños. Todo esto sin que Bob haya cambiado nada o haya guardado el archivo él mismo.
El cambio automático más común que estamos viendo es la desaparición o reaparición de toda la jerarquía de etiquetas <classes>
cerca del final de un archivo de guión gráfico. No hemos descifrado qué está causando esto. Es posible que tengamos varias versiones localizadas de un guión gráfico en varios directorios .lproj, y al abrirlos dentro de Interface Builder, la jerarquía de clases puede ser eliminada espontáneamente de algunos y agregada a otros, o dejada de lado en algunos. Esto causa mucho ruido en git diff
, pero en realidad no rompe ninguna funcionalidad. A menudo agregaremos selectivamente los cambios que realizamos en el índice de git, los cometeremos y luego descartaremos los cambios espontáneos y sin sentido de <classes>
. Esto es para mantener los compromisos pequeños y agradables, como deberían ser. Eventualmente, solo se vuelve demasiado molesto, ya que Xcode sigue repitiendo los cambios, y alguien simplemente los compromete con algunas otras cosas ... lo cual está bien hasta que Xcode de otra persona decida querer cambiarlas por ningún otro motivo. razón aparente. (Nuestro historial de commits tiene muchas maldiciones sobre esto).
¿Alguien más está viendo este comportamiento? ¿Es esto un error de Xcode o un problema de configuración en uno o más de nuestros Mac desarrolladores? Hemos visto un comportamiento similar cuando colaboramos con archivos XIB, pero los guiones gráficos parecen ser más susceptibles a esto.
Es útil saber por qué está ocurriendo esta locura, pero para aquellos que creen en mantener sus proyectos libres de advertencias y que solo quieren una solución rápida y sucia para que sus proyectos vuelvan a un estado saludable:
No comprometa nada hasta que se le indique explícitamente.
Abra Xcode y cree un nuevo guión gráfico (Comando + N> iOS> Interfaz de usuario> Guión gráfico). Asumiré que lo llamas el nombre predeterminado de
Storyboard.storyboard
.Abra el guión gráfico que Xcode ha violado.
Base.lproj/Main.storyboard
esto esBase.lproj/Main.storyboard
.Seleccione y copie todo en el guión gráfico (Comando + A luego Comando + C).
Abre
Storyboard.storyboard
.Copie y pegue todo en
Storyboard.storyboard
.Cerrar Xcode.
Abra una terminal y cambie directorios a su repositorio.
Reemplace
Main.storyboard
conStoryboard.storyboard
(mv Storyboard.storyboard Base.lproj/Main.storyboard
).git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode''s insanity."
Ignore los cambios en
project.pbxproj
través degit checkout -- project.pbxproj
. Sigit diff
el archivo, verá que acaba de agregar información sobre nuestro guión gráfico temporal (que ya no existe).Abra la copia de seguridad de Xcode y vea que las advertencias han desaparecido.
Respirar.
Este es un error en XCode 4.5+, espero que se solucione, y sí es un PITA.
Aquí está el error completo en Apple
¿Cómo evitar las ediciones gratuitas de Xcode en los archivos del guión gráfico?
Este problema se puede mitigar mediante un uso extremadamente juicioso de git add -p
en cualquiera de los archivos generados de Xcode, incluidos guiones gráficos, XIB, modelos de datos principales y archivos de proyectos, todos los cuales sufren modificaciones transitorias similares que no tienen impacto en el real interfaz / modelo / proyecto.
Los cambios no deseados más comunes que he visto en los guiones gráficos son los números de versión del sistema (como usted menciona) y la constante adición y eliminación de la sección <classes>
, cuya omisión nunca he visto causar problemas. Para XIB, es la adición y eliminación de <reference key="NSWindow"/>
, que ni siquiera es una clase en Cocoa Touch. Simplemente guau.
Piénsalo como el mar: hay marea alta y baja. Deja que te lave.
Ahh. Eso es.
Puede ignorar estas modificaciones al organizar sus cambios, restablecer los cambios no deseados y realizar una confirmación limpia.
La única ventaja que he visto con guiones gráficos sobre XIB desde un punto de vista técnico es que Apple aún no ha castrado a FileMerge para negarse a fusionar guiones gráficos en conflicto. (FileMerge solía fusionar XIB, pero las versiones más nuevas lo rompieron. ¡Thxxxx chicos 💜!)
¡Registre muchos errores sobre todos estos problemas en http://bugreporter.apple.com/ ! Y no te olvides de crear entradas en OpenRadar .
Esto no es un error, esto es una consecuencia de cómo Xcode procesa los archivos del guión gráfico. Estoy escribiendo un programa de diferencias y fusión para los archivos del guión gráfico (enlace GitHub) y he pasado horas analizando la lógica de los archivos del guión gráfico y cómo lo procesa Xcode. Esto es lo que descubrí:
¿Por qué ocurren cambios extraños en los archivos del guión gráfico? Xcode usa la API NSXML para analizar los archivos del guión gráfico en una estructura de árbol lógica basada en
NSSet
. Cuando Xcode necesita escribir cambios, crea unNSXMLDocument
basado en la estructura de árbol lógica, borra el archivo del guión gráfico y llama aXMLDataWithOptions:
paraXMLDataWithOptions:
a llenar el archivo. Como los conjuntos no conservan el orden de sus elementos, incluso la más mínima modificación podría cambiar todo el archivo XML del guión gráfico.¿Por qué la etiqueta de clase desaparece o reaparece aleatoriamente? La sección
<class>
no es más que un caché de Xcode interno. Xcode lo usa para almacenar información sobre las clases en caché. La memoria caché cambia a menudo. Los elementos se agregan cuando los archivos de clase.h/.m
se abren y eliminan cuando Xcode sospecha que están desactualizados (al menos los antiguos Xcodes se comportan así). Cuando guarda el guión gráfico, la versión actual de la memoria caché se descarta, por lo que la sección<class>
menudo cambia o incluso desaparece.
No he invertido la ingeniería Xcode; Hice estas observaciones experimentando con Xcode y archivos de guiones gráficos. Sin embargo, estoy casi 100% seguro de que funciona de esta manera.
Conclusiones
- La sección de caché no es importante; usted puede ignorar cualquier cambio en él.
- Al contrario de lo que puedes encontrar en todos los foros, fusionar los archivos de guiones gráficos no es una tarea complicada. Por ejemplo, supongamos que
MyController1
controlador de vistaMyController1
en un documento de guión gráfico. Abra el archivo del guión gráfico y busque algo como esto<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>
. Puede realizar cambios solo de forma segura en esta sección e ignorar todo lo demás. Si cambió los segues o las restricciones, también debe confirmar todo lo que tenga“ory-XY-OBM”
dentro. ¡Sencillo!
Tirar otra respuesta aquí porque esta situación ha mejorado mucho. El XML para el archivo XIB que representa el StoryBoard se ha simplificado enormemente.
Recientemente también mordí la bala y comencé a usar la interfaz en Xcode para Source Control. He estado en la línea de comandos durante años y feliz allí, pero la interfaz es agradable y te permite dividir los commits, lo cual es muy importante si usas un sistema de tickets que enlaza con commits.
De todos modos, me di cuenta hoy de que hubo un cambio en el guión gráfico y el diff integrado me mostró que era un atributo único en la etiqueta del documento (systemVersion). Así que no es un gran problema.
He leído artículos donde la gente dice que los SB fueron prohibidos en sus equipos debido a la fusión de problemas. Locura total Son tan sorprendentes, especialmente ahora que tienen una función de autodiseño inteligente incorporada, realmente te estás perdiendo si no los estás usando.