Приложение 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))

Затем обработчик будет перехватывать вызовы, и обычные методы делегата приложения не будут вызываться.

Другие вопросы по тегам