persistait launchOptions NSURL comme variable globale
-
29-09-2019 - |
Question
J'ai associé mon application avec une infection urinaire afin que les utilisateurs peuvent lancer des pièces jointes KML. Dans le délégué de l'application iPad de mon application universelle, je peux voir les launchOptions et de ces j'obtenir une NSURL pour le fichier en cours de lancement. Je veux stocker ceci comme si global que je puisse y accéder d'ailleurs dans mon application, je fais cela à l'aide d'un singleton appelé moteur. Ceci est mon délégué App:
- (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;
}
regarde la classe Mon moteur comme 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 (à partir d'un contrôleur View) le débogueur montre la valeur de Engine.launchFile soit. J'accède comme la variable suivante:
- (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];
}
Toute aide?
La solution
Votre code semble correct à première vue - pouvez-vous définir un point d'arrêt sur myEngine.launchFile = juste pour voir ce que myEngine montre du doigt? Cela devrait vous assurer que votre code singleton fonctionne.
Aussi, avez-vous vérifié que [launchOptions valueForKey: @ "UIApplicationLaunchOptionsURLKey"] retourne sans aucun doute un objet? Vouliez-vous dire taper ceci:
[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
Sam
P Vous devriez lire le réponse à cette question sur la création d'objets singleton, il y a quelques remplacements que vous devriez mettre dans votre classe de moteur;)