Pregunta

He leído guía "Su primera aplicación iOS" de Apple y todo lo que hay parece claro para mí. Sin embargo, cuando trato de entender cómo plantilla de aplicación iOS basados ??en Vista funciona proporcionada en XCode, me encuentro con algunos interrogantes interesantes.

Yo entiendo que la aplicación recibe el nombre de archivo principal de punta (por lo general, la MainWindow.xib) forman el archivo * -Info.plist. Lo que no entiendo es, ¿cómo funciona el saber qué archivo XCode plumín está asociado con el controlador que se crea con esta plantilla aplicación basada en Vista por defecto. En la guía, que comenzar con la aplicación basada en la ventana, y que "tiene que escribir" algo como:

MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

[self setMyViewController:aViewController];

, que tiene mucho sentido. Sin embargo, resulta que en la plantilla de aplicación iOS basados ??en Vista no hay tal cosa, y que esta especificación semilla no fue realmente necesario, en primer lugar, siempre y cuando creó su subclase UIViewController con la opción "Con XI ter para la interfaz de usuario "marcada. Mi pregunta es, ¿cómo sabe XCode la que la semilla está asociado con este controlador, es decir, es que el almacenamiento de esta conexión en algunos de los archivos, o tal vez por algún tipo de convención (el mismo nombre para el controlador y el archivo de la semilla, tal vez)? Por otra parte, ¿dónde 'cargado desde MyViewBasedAppController ''' provienen de los subtítulos en opinión de interfaz constructor del controlador dentro MainWindow.xib? No es, sin duda existe cuando agrego el controlador a mano, así que tengo curiosidad por lo que la magia no XCode hacer detrás de la espalda, cuando pienso Sólo estoy seleccionando una plantilla simple código.

¿Fue útil?

Solución

Si nos fijamos en la información de destino (doble clic en el objetivo de sacar el tema), pestaña 'Propiedades' verá el nombre del archivo principal de la plumilla. Las palabras 'Nib' y 'Xib' son intercambiables para estos fines; Xib es sólo una nueva alternativa para la plumilla.

Será fresca 'MainWindow' de la plantilla. Si abre MainWindow.xib verá que existe en un objeto llamado '[nombre del proyecto] Aplicación Delegado', y si muestra el inspector y comprueba en la pestaña 'i' verá el tipo de clase que es nombrada en la parte superior. Si marca la pestaña de conexiones (la flecha hacia la derecha), podrás ver que el propietario del archivo (que es la misma UIApplication) tiene su propiedad 'delegado' adjunta.

También verá que tiene una salida llamada 'viewController'. Que se une a otro objeto en el xib llamada '[nombre del proyecto] Vista Controlador'. Compruebe el tipo en eso y verá que es el tipo de controlador de vista que Xcode ha añadido a su proyecto. En cuanto a sus atributos (la primera ficha en el inspector, con el deslizador gráfico), también verá que un archivo semilla separada se especifica como que contiene sus principales detalles.

Por mor del argumento, supongamos que llamé a mi proyecto 'NibTest' y realizado ningún cambio.

En tiempo de ejecución, la Info.plist cargas de dispositivos. Ahí se ve que el delegado es de tipo NibTestAppDelegate. Lo que va a crear una instancia de la clase NibTestAppDelegate y establezca la propiedad delegado del UIApplication a él.

A continuación, va a ver desde que MainWindow.nib NibTestAppDelegate tiene un miembro denominado viewController de tipo NibTestViewController. Por lo que va a crear una instancia de esa y establezca la propiedad viewController en la instancia NibTestAppDelegate que acaba de crear para ello.

Al hacer que va a abrir la otra xib y continuar haciendo el mismo tipo de medidas.

Objetivo-C tiene un tiempo de ejecución totalmente reflectante, por lo que puede crear instancias de objetos por su nombre de la clase en tiempo de ejecución. Esta es una de las diferencias entre Objective-C y C ++, por ejemplo.

Xcode no está generando ningún código oculto o depender de ningún convenciones de nombres ocultos. Todo el asunto está resuelto en tiempo de ejecución por el sistema operativo.

EDIT: por ejemplo, en lugar de su ejemplo:

    MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

En realidad se podría hacer:

    MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Ellos funcionan de forma idéntica mientras exista MyViewController en el programa o en el tiempo de ejecución más amplio.

alternativamente, podría pasar cualquier otro objeto de cadena te gusta NSClassFromString. Incluso pedir al usuario si lo desea (aunque sería una muy mala idea por razones de seguridad).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top