rojo - mi iphone no carga pero aparece que si
Carga dinámicamente de plumillas para iPhone/iPad en el controlador de vista (5)
He convertido una aplicación de iPhone utilizando el asistente como cosa en XCode en una aplicación universal.
Se construye bien, pero obviamente parece un poco de basura en algunas áreas :)
Necesito cargar las puntas según el dispositivo que se esté utilizando. No deseo crear mis controladores de vista usando initWithNib
ya que ya tengo código para crear los controladores con algunos datos ( initWithMyLovelyData
) que no hacen nada que ver con la carga de plumillas.
Sé que para averiguar el dispositivo que usas UI_USER_INTERFACE_IDIOM()
, intenté reemplazar el initWithNibName
dentro de los controladores de vista reales, asumiendo que se llaman internamente de alguna manera. Pero no está funcionando ya que creo que no estoy seguro de la sintaxis.
Yo he tratado
if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];
Y eso no funciona: /
EDITAR - Sé que lo he editado masivamente, he hecho mi pregunta un poco más específica después de investigar un poco más, ¡disculpas!
Acabo de poner estos dos métodos en una clase llamada IPadHelper, y uso el método addIPadSuffixWhenOnIPad para elegir condicionalmente entre dos nibs dependiendo de la plataforma
+ (BOOL)isIPad{
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
return YES;
}
}
return NO;
}
+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{
if([IPadHelper isIPad]){
return [resourceName stringByAppendingString:@"-iPad"];
}
else {
return resourceName;
}
}
vea aquí h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html para obtener una explicación más detallada del primer método ...
Creo que será mejor crear un archivo C.
FileHelper.h
#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);
FileHelper.m
#import "FileHelper.h"
BOOL isIPad() {
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) {
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
return YES;
}
}
return NO;
}
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) {
if(isIPad()) {
return [resourceName stringByAppendingString:@"-iPad"];
}
else {
return resourceName;
}
}
EDITAR: @ respuesta de Adán a continuación es la respuesta correcta.
Para determinar qué punta cargar, haga lo siguiente y initWithMyLovelyData
método initWithMyLovelyData
y use una propiedad para configurar los datos. Debería poder mover fácilmente todo su código de inicio al método de establecimiento de propiedades.
MyViewController *viewController;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil];
} else {
viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil];
}
viewController.myLovelyData = someData;
En realidad, Apple hace todo esto de forma automática, simplemente nombre sus archivos NIB:
MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad
y cargue su controlador de vista con la menor cantidad de código:
[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything
Puedes tener tu pastel y comerlo también. Solo agregue un método que contenga initWithNibName: bundle: y agregue su parámetro myLovelyData:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myLovelyData:(id)data
{
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))
{
// Custom initialization using myLovelyData
//
}
return self;
}