NSApplicationDelegate应用程序:openFile。永远不会到达openFile:功能

时间:2013-10-29 10:42:27

标签: objective-c macos cocoa nsapplication-delegate

我想在app图标上打开一个文件。 当我这样做时,我的应用程序被打开,因此文件扩展名已明确定义并与我的应用程序相关。 但永远不会调用application:openFile:函数。所以我无法打开我的应用程序中丢弃的文件。 我跟踪openFile:,但永远不会去。

我找到的所有答案都只是在代理中添加openFile:,而这只是我的情况而已。

任何帮助都会非常感激。非常感谢。

这是我的环境。

plist已经获得了要打开的文件的扩展名。我删除文件时会打开我的应用程序。

我在应用程序的开始时初始化我的委托,

   mydelegate = [[MyController alloc] init];

在代表中,

在include中,

@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

3 个答案:

答案 0 :(得分:1)

至少在上面提供的代码中,您没有明确地将应用程序的委托设置为MyController的实例。你在任何地方设置代表吗?

立即关注[[MyController alloc] init],试试这个:

[[NSApplication sharedApplication] setDelegate: mydelegate];

如果不进行此连接,应用程序将无法知道谁应该处理委派职责。

OR

处理拖放到停靠栏图标的最常用方法是简单地实现:

-(BOOL)application:(NSApplication *)sender openFile:(NSString *)path

作为AppDelegate类的一部分,在您启动项目时由Xcode自动生成。

答案 1 :(得分:0)

在您获取filePath的方法中包含以下一行: -

//Include this line for calling your method
[self application:[NSApplication sharedApplication]openFile:filename];

答案 2 :(得分:0)

如果您有AppleEvent事件处理程序正在监听'odoc'打开文档Apple事件:

NSAppleEventManager.shared().setEventHandler(self,
                                             andSelector: #selector(handle(event:replyEvent:)),
                                             forEventClass: AEEventClass(kCoreEventClass),
                                             andEventID: AEEventID(kAEOpenDocuments))

然后,处理程序将拦截这些调用,并且不会调用常规的App Delegate方法。