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?

Était-ce utile?

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;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top