iOS: ¿Utiliza modificadores de dispositivos para cargar archivos xib?

Puede usar un modificador de dispositivo (es decir, ~ ipad) para proporcionar una clave específica del dispositivo en Info.plist y para especificar una imagen de inicio específica del dispositivo (Default.png para iPhone, y Default ~ ipad.png para iPad, para ejemplo). Esas dos cosas se mencionan específicamente en Apple Docs , pero no dicen que esto funcionará para ningún otro tipo de archivos.

Descubrí (por accidente) que esto funciona para cargar archivos initWithNibName:bundle: través de initWithNibName:bundle: Entonces, por ejemplo, puedo tener MyView.xib y MyView ~ ipad.xib, y este código:

 MyViewController *viewController = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil]; 

… cargará completamente MyView ~ ipad.xib en un iPad, y MyView.xib en otros dispositivos.

Entonces, 1) ¿Está esto documentado en alguna parte? Seguro que no podría encontrar ningún documento de Apple. Es más útil que comprobar UI_USER_INTERFACE_IDIOM () y codificar dos nombres de plumillas diferentes en todas partes, pero un poco no confío si no está documentado.

Y, 2) ¿Alguien sabe en qué versión de iOS comenzó a funcionar? Solo lo probé en 4.2, y funciona allí. Los modificadores del dispositivo en general (incluso para los elementos documentados enumerados anteriormente) tienen un mínimo de 4.0.

En realidad, está explícitamente definido en los documentos, pero como nota al pie.

Nibs de cocoa

En la nota en la parte inferior de “Cargando archivos NIB utilizando NSBundle”:

Nota: Si está desarrollando una aplicación Universal para iOS, puede usar las convenciones de nomenclatura específicas del dispositivo para cargar automáticamente el archivo de punta correcto para el dispositivo subyacente. Para obtener más información acerca de cómo nombrar sus archivos Nib, consulte “iOS Admite recursos específicos del dispositivo”.

Qué enlaces a Cocoa Conceptual LoadingResources

Sin embargo, sí, esta es una función solo 4.0+.

Yo tuve el mísmo problema. La respuesta no tenía sentido al principio, ¡pero la buena noticia es que es fácil de hacer! 🙂

Simplemente nombre sus iPad xibs sin ningún modificador y su iPhone xibs con ~ iphone modificador y los seleccionará correctamente.

Entonces, con MyViewController, tendrá MyViewController.xib para el iPad y MyViewController~iphone.xib para el iPhone. Entonces puedes simplemente iniciar tu controlador de vista con alloc / init simple.

[[MyViewController alloc] init] y tomará el xib correcto.

Entonces, cuando creo un nuevo controlador de vista en XCode, siempre elijo el cuadro para formatearlo para ipad, porque el xib que creará se llamará MyViewController.xib y querrá que ese sea el xib de tamaño iPad. Luego creo un segundo xib, formateado para iPhone y asígnele el nombre con el modificador ~ iphone.

La documentación es un poco contradictoria a veces, pero esta página habla sobre cómo los recursos con un identificador se convertirán por defecto en iPad.

ImageSoundResources

Verifique la sección sobre el uso de imágenes de alta resolución. Sé que estamos hablando de xibs y no imágenes, pero funciona. Mis últimas 6 aplicaciones han usado este idioma.

Odio ser ese tipo y responder a mi propia pregunta, pero creo que la respuesta es:

1) No, no está explícitamente documentado en ninguna documentación de Apple, y
2) 4.0 y superior (esto basado en mis propias pruebas)

Todo lo que realmente guarda es un par de líneas de verificación de código para UI_USER_INTERACE_IDIOM (). Aún así, lo tomaré. Menos código es menos código.

La técnica apropiada para usar en iOS 3.2 y posterior es la función UI_USER_INTERFACE_IDIOM() . Normalmente utilizo un operador ternario para UIViewController el UIViewController con el XIB apropiado.

 UIViewController* controller = [[UIViewController alloc] initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? @"YourViewController-iPad" : @"YourViewController" andBundle:nil];