Приложение NSApplicationDelegate:openFile. Никогда не доходит до openFile: функция
Я хочу открыть файл, поместив его на значок приложения. Когда я делаю это, мое приложение открывается, поэтому расширение файла четко определено и связано с моим приложением. Но application:openFile:
функция никогда не вызывается. поэтому я не могу открыть файл, добавленный в мое приложение. Я проследил openFile:
но никогда не идет.
Все ответы, которые я нашел, просто добавить в делегат openFile:
и это все, но не в моем случае.
Любая помощь будет очень признателен. Заранее большое спасибо.
Это моя среда.
У plist есть расширение открываемых файлов. Мое приложение открывается, когда я сбрасываю файлы.
Я инициализирую своего делегата в начале приложения,
mydelegate = [[MyController alloc] init];
И в делегате,
в том числе,
@interface MyController : NSObject <NSApplicationDelegate> {
@private
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
-(id) init;
-(BOOL) application: (NSApplication*)sharedApplication openFile:(NSString*) fileName;
@end
И в файле.m,
@implementation MyController
@synthesize window;
- (id)init{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillFinishLaunching:)
name:NSApplicationWillFinishLaunchingNotification object:nil];
}
return self;
}
- (void) applicationWillFinishLaunching:(NSNotification *)aNotification{
NSLog(@"applicationWillFinishLaunching");
}
-(BOOL) application: (NSApplication*)sharedApplication openFile:(NSString*) fileName {
NSLog(@"openFile=%@", fileName);
return YES;
}
@end
2 ответа
По крайней мере, в приведенном выше коде вы явно не устанавливаете делегат приложения как экземпляр MyController
, Вы устанавливаете делегата где-нибудь?
Сразу после [[MyController alloc] init]
, попробуй это:
[[NSApplication sharedApplication] setDelegate: mydelegate];
Без этого соединения приложение не будет знать, кто должен выполнять обязанности делегата.
ИЛИ ЖЕ
Наиболее распространенный способ обработки перетаскивания на значок панели - просто реализовать:
-(BOOL)application:(NSApplication *)sender openFile:(NSString *)path
как часть класса AppDelegate, который автоматически генерируется для вас Xcode при запуске проекта.
Включите эту строку в ваш метод, где вы получаете filePath:-
//Include this line for calling your method
[self application:[NSApplication sharedApplication]openFile:filename];
Если у вас есть обработчик событий AppleEvent, который прослушивает 'odoc'
События Apple Open Document:
NSAppleEventManager.shared().setEventHandler(self,
andSelector: #selector(handle(event:replyEvent:)),
forEventClass: AEEventClass(kCoreEventClass),
andEventID: AEEventID(kAEOpenDocuments))
Затем обработчик будет перехватывать вызовы, и обычные методы делегата приложения не будут вызываться.