2009-04-19 10 views
17

He pasado tiempo aprendiendo a usar el SDK de iPhone. He leído "Beginning iPhone Development: Exploring the iPhone SDK" de principio a fin y nunca he visto un ejemplo de vistas múltiples dentro de un XIB.Múltiples vistas dentro de un XIB - SDK de iPhone

Para ilustrar lo que quiero decir, aquí es una captura de pantalla de un XI ter con la simple configuración de lo que me refiero:

alt text http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

que darse cuenta de eso tiene que haber una razón muy específica que nunca he visto esto En los ejemplos de Apple y en todas mis lecturas hasta el momento, se usan múltiples XIB con una sola 'vista' (y algunas veces el Controlador de navegación o un Controlador de barra de pestañas, etc.). ¿Cuál es la razón para esto? ¿Debo evitar múltiples vistas dentro de un XIB? ¿Cuáles son las ventajas o desventajas de cualquiera de los métodos?

gracias de antemano

Respuesta

21

Es una cuestión de optimización de la memoria y los tiempos de carga. Si coloca todas sus vistas en un XIB, cuando la aplicación se lance, debe cargar todo el XIB en la memoria y construir todos los objetos para todos los controles, y esto lleva una cantidad de tiempo no trivial.

Si por el contrario separa sus vistas en XIB separados, entonces su aplicación se iniciará mucho más rápido, porque solo se cargará el XIB que contiene la vista inicial, y también usará menos memoria al principio. Luego, cuando la vista cambie, puede cargar el XIB que contiene la nueva vista perezosamente. Esto provocará un enganche menor al abrir una vista por primera vez. Si está realmente tratando de optimizar el uso de la memoria, también puede descargar la vista anterior al cambiar de vista, pero no lo recomendaría, ya que esto generará un problema cada vez que cambie de vista, en lugar de solo la primera vez cambias a cualquier vista dada.

+0

No estoy muy claro sobre la distinción entre "ver" y XIB aquí. Para un ejemplo (real), digamos que tengo que implementar algo con una vista de mapa en la parte superior, 3 botones en la parte inferior y diferentes controles en el medio dependiendo de una condición. Ese medio podría ser a.) Etiquetas, formateadas de una manera particular, ob) una imagen y menos etiquetas, formateadas de una manera diferente. Mi pensamiento era 3 vistas: una vista para manejar cada uno de esos grupos de controles (mapa, controles condicionales, botones). ¿Es una mejor práctica hacer 3 vistas en un XIB o simplemente poner todos los controles en una vista? – Danny

+0

Por supuesto, no debe poner * cada * vista en un solo XIB, pero le preguntó si hay una razón por la que no debería hacerlo. Definitivamente hay momentos en que es útil. –

4

Siguiendo la respuesta anterior, hay ocasiones en las que desea cargar varias vistas al mismo tiempo. Aquí hay un ejemplo: está mostrando un informe con varias páginas y va a utilizar UIScrollView para administrarlas. Cuando el usuario termine de explorar el informe, cerrará el informe que desechará la vista.

Cree un UIScrollView en un XIB junto con una UIView para cada página que necesite. Como las UIViews son parte del XIB, se cargarán en la memoria juntas, todas a la vez, cuando se abra el informe. Cree dos UIViewControllers y úselos para mostrar la página que se está viendo y la que se está desplazando. A medida que el usuario avanza por las páginas, vuelva a utilizar el UIViewController en la página que se está desplazando para mantener la página en la que se está desplazando.

Esto garantizará un excelente rendimiento mientras el usuario hojea las páginas. Carga todas las páginas a la vez en la memoria. Solo uso dos UIViewControllers, y solo cambia las vistas que hay en ellas y las mueve.

Esto también tiene la gran ventaja de tener todas las páginas en un XIB. Hace que sea más fácil de editar y más rápido de cargar que separar los XIB. Solo debe asegurarse de tener la memoria para cargar todas las páginas a la vez. Si se trata de contenido estático (como en mi caso), es una excelente forma de hacerlo.

Si lo que buscas es un buen ejemplo de cómo hacer esto, me encontré con este recurso para ser un excelente punto de partida:

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

1

Esta es una advertencia para cualquiera que trate de poner en práctica el paisaje y retrato con dos vistas en un solo XIB (iOS 4 con Xcode 4).La principal desventaja de tener dos vistas en un solo XIB -para mí- era que solo puede conectar un único objeto UIOutlet en un XIB a un único objeto UIOutlet en un controlador de vista.

Así, por ejemplo, si tiene un XIB con una vista para horizontal y una vista para vertical, y ambas vistas contienen los mismos objetos de interfaz en diferentes posiciones (como UILabel en horizontal y UILabel en vertical). No es posible vincular el UILabel en su vista de retrato y el objeto UILabel en la vista de paisaje a un único objeto UILabel en el controlador de vista al mismo tiempo.

Me parece una desilusión, ya que la documentación de iOS UIViewController (iOS 4.3) me sugirió que podría implementar vistas personalizadas de paisaje y retrato al cambiar entre dos vistas mediante programación a medida que la pantalla gira.

Después de pasar bastante tiempo para descubrir cómo hacerlo, descubrí que es posible tener dos vistas diferentes conectadas a un único controlador de vista, pero necesita tener salidas para ambas vistas. Por ejemplo, en mi controlador de vista, tengo dos objetos UILabel (uno para conectarse a un UILabel en la vista vertical, uno para conectarse a un UILabel en la vista horizontal). En mi código, cada vez que actualizo el paisaje, también actualizo el panorama del retrato.

No es muy elegante, pero funciona, y como se trata de una vista simple con una pantalla, no utilizará demasiada memoria para tener todos los objetos UI duplicados en el controlador y las vistas. No crearía un proyecto que lo hiciera de esa manera otra vez, pero fue una buena solución para ese proyecto.

Cuestiones relacionadas