2010-06-22 5 views
0

J'ai associé mon application à une UTI pour que les utilisateurs puissent lancer des pièces jointes KML. Dans le délégué de l'application iPad de mon application universelle, je peux voir le launchOptions et à partir de ceux-ci, je reçois un NSURL pour le fichier en cours de lancement. Je veux stocker cela comme un global afin que je puisse y accéder d'ailleurs dans mon application, je le fais en utilisant un singleton appelé Engine. Ceci est mon délégué App:persistante launchOptions NSURL comme variable globale

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    Engine *myEngine=[Engine sharedInstance]; 

    StormTrackIpad *newVC=[[StormTrackIpad alloc] initWithNibName:@"StormTrackIpad" bundle:nil]; 
    [window addSubview:newVC.view]; 

    NSURL *launchFileURL=(NSURL *)[launchOptions valueForKey:@"UIApplicationLaunchOptionsURLKey"]; 

    myEngine.launchFile=launchFileURL; 

    /* Show details of launched file 

    NSString *message =launchFileURL.absoluteString; 
    NSString *title = [NSString stringWithFormat:@"Opening file"];    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 

    */ 

    [window makeKeyAndVisible]; 

    return YES; 
} 

Ma classe de moteur ressemble à ceci:

// Engine.h 

#import <Foundation/Foundation.h> 

@interface Engine : NSObject { 
    NSURL *launchFile; 
} 

+ (Engine *) sharedInstance; 

@property (nonatomic, retain) NSURL *launchFile; 

@end 

// Engine.m 

#import "Engine.h" 

@implementation Engine 
@synthesize launchFile; 

static Engine *_sharedInstance; 

- (id) init 
{ 
    if (self = [super init]) 
    { 
     // custom initialization 
    } 
    return self; 
} 

+ (Engine *) sharedInstance 
{ 
    if (!_sharedInstance) 
    { 
     _sharedInstance = [[Engine alloc] init]; 
    } 
    return _sharedInstance; 
} 

@end 

Mon problème est que lorsque je tente d'accéder à la variable launchFile du moteur ailleurs dans mon application (d'une Voir Controller) le débogueur affiche la valeur de Engine.launchFile à être. J'accède à la variable comme ceci:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    Engine *myEngine=[Engine sharedInstance]; 

    NSURL *launchFile=myEngine.launchFile; 

    NSString *title = [NSString stringWithFormat:@"Opening file"];    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:launchFile.absoluteString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

Une aide?

Répondre

0

Votre code semble OK à première vue - pouvez-vous définir un point d'arrêt sur myEngine.launchFile = juste pour voir ce que myEngine pointe vers? Cela devrait vous assurer que votre code singleton fonctionne.

Avez-vous également vérifié que [launchOptions valueForKey: @ "UIApplicationLaunchOptionsURLKey"] renvoie définitivement un objet? Vouliez-vous dire taper ceci:

[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey]; 

Sam

P Vous devriez lire le answer to this question sur la création d'objets singleton, il y a quelques remplacements que vous devriez mettre dans votre classe moteur;)

+0

Salut Sam, J'ai changé ma clé comme vous l'avez suggéré. Je ne suis pas sûr de vous avoir suivi lors de la définition d'un point d'arrêt sur myEngine.launchURL (même en supposant que vous vouliez dire myEngine.launchFile). Où/comment est-ce que je définirais ceci et comment je le regarderais? Je ne sais pas comment déboguer mon application lorsque je la lance depuis une autre application (Mail). J'ai ajouté le journal suivant à la fois dans le délégué de l'application après avoir défini myEngine.launchFile, et dans le View Controller. Dans le délégué, il signale l'URL correcte, dans le VC il signale null. \t NSLog (@ "URL de fichier de lancement:% @", myEngine.launchFile.absoluteString); J'apprécie vraiment votre aide, merci! JP –

+0

Oh, j'ai ajouté les remplacements suggérés aussi ... :-) –

+0

Vous avez raison sur myEngine.launchURL - Je voulais dire myEngine.launchFile! J'ai changé la question pour la rendre plus claire pour quiconque la lisait :) – deanWombourne