Упорные опоры NSURL как глобальная переменная
-
29-09-2019 - |
Вопрос
Я связал свое приложение с помощью UTI, чтобы пользователи могли запустить вложения KML. В приложении iPad делегат моего универсального приложения, которое я вижу застытия и от этого я получаю NSURL для запущенного файла. Я хочу хранить это как глобальный, чтобы я мог получить доступ к нему из других точек в моем приложении, я делаю это, используя Singleton, называемый двигателем. Это мой приложение делегат:
- (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;
}
Мой класс двигателя выглядит так:
// 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
Моя проблема заключается в том, что когда я пытаюсь получить доступ к переменной файлам LaunchFile от двигателя в других местах в моем приложении (из контроллера представления) Отладчик показывает значение Engine.launchfile. Я получаю доступ к переменной, как это:
- (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];
}
Любая помощь?
Решение
Ваш код выглядит нормально, на первый взгляд - можно ли установить точку останова на MyEngine.launchfile = просто чтобы увидеть, на что указывает MyEngine? Это должно убедиться, что ваш Singleton Code работает.
Кроме того, вы проверили, что [Launchtions ValueForkey: @ «UiapplicationLaunchoCtionsurlkeationLaunchOptionsurlkey», определенно возвращает объект? Вы имели в виду, чтобы ввести это:
[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
Сэм
Р ты должен прочитать Ответ на этот вопрос На создании объектов Singleton есть несколько переопределений, которые вы должны поместить в ваш класс двигателя;)