2010-06-16 2 views
20

J'ai converti une application iPhone en utilisant l'assistant comme chose dans XCode dans une application universelle.Charge dynamique de la plume pour iPhone/iPad dans le contrôleur de vue

Il se construit bien, mais semble évidemment un peu de déchets dans certaines régions :)

je dois charger grué selon lequel appareil est utilisé. Je ne souhaite pas créer mes contrôleurs de vue en utilisant initWithNib comme j'ai déjà le code pour créer les contrôleurs avec quelques données (initWithMyLovelyData) qui ne fait rien à faire avec le chargement de plume.

Je sais de trouver l'appareil que vous utilisez UI_USER_INTERFACE_IDIOM() alors j'ai essayé de remplacer le initWithNibName dans les contrôleurs de vue eux-mêmes, en supposant qu'ils sont appelés en interne en quelque sorte. Mais ça ne marche pas car je suppose que je ne suis pas sûr de la syntaxe.

J'ai essayé

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil]; 

Et cela ne fonctionne pas:/

EDIT - Je sais que j'ai massivement édité cela, fait ma question un peu plus précis après avoir fait quelques recherches - excuses!

+0

btw, s'il vous plaît ne pas lmgtfy. – Will

Répondre

22

EDIT: @ La réponse d'Adam ci-dessous est la bonne réponse.

Pour déterminer la plume à charger, procédez comme suit et supprimez votre méthode initWithMyLovelyData et utilisez une propriété pour définir les données. Vous devriez être capable de déplacer facilement tout votre code init dans la méthode setter de la propriété.

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; 
+0

Désolé de déterrer des vieux (er) messages mais: Cela ne fonctionne pas pour moi. Des idées? – Linuxmint

+0

@Linuxmint Quel est votre problème? – kubi

+0

http: // stackoverflow.com/questions/5306346/problème-avec-chargement-un-séparé-xib-pour-ipad-ou-iphone – Linuxmint

2

Je viens de mettre ces deux méthodes dans une classe appelée IPadHelper, et utilise la méthode addIPadSuffixWhenOnIPad pour choisir conditionnellement entre deux pointes en fonction de la plate-forme

+ (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; 
    } 
} 

voir ici h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html pour plus d'explications de la première méthode ...

+0

Le compilateur a déclaré que cela est incorrect, car les méthodes de classe doivent renvoyer des objets (id). Donc, si vous pensez qu'il vaudrait mieux l'ajouter au fichier C. – rowwingman

2

Vous pouvez avoir votre gâteau et le manger aussi. Il suffit d'ajouter une méthode qui enveloppe initWithNibName: bundle: et ajoute votre paramètre myLovelyData:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myLovelyData:(id)data 
{ 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     // Custom initialization using myLovelyData 
     // 
    } 
    return self; 
} 
0

Je pense qu'il sera préférable de créer un fichier 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; 
    } 
} 
74

En fait, Apple fait tout cela automatiquement, nommez simplement vos fichiers NIB:

MyViewController~iphone.xib // iPhone 
MyViewController~ipad.xib // iPad 

et charger votre contrôleur de vue avec le la plus petite quantité de code:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything 
+2

si vous utilisez cette instruction: [MyViewController alloc] init]; dans l'exemple ci-dessus à la place, fait-il exactement la même chose? ou fait-il quelque chose de légèrement différent? – hokkuk

+0

Je pense que "init" ne fait rien. Si vous voulez charger un NIB, vous devez appeler initWithNib - ou charger manuellement un NIB à partir de l'ensemble – Adam

+2

[[MyViewController alloc] init] est exactement le même que [[MyViewController alloc] initWithNibName: nil nibBundle: nil] est mentionné dans le fichier UIViewController.h: "Si vous sous-classez UIViewController, vous devez appeler la super implémentation de cette méthode , même si vous n'utilisez pas de NIB. (Par commodité, la méthode init par défaut le fera pour vous , et spécifiez zéro pour les deux arguments de cette méthode.) " – jsd

Questions connexes