3

我想打开一个文件,将其放在应用程序图标上。当我这样做时,我的应用程序已打开,因此文件扩展名已明确定义并与我的应用程序相关。但是该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
4

3 回答 3

2

至少在上面提供的代码中,您没有明确地将应用程序的委托设置为MyController. 您是否在任何地方设置委托?

紧接着[[MyController alloc] init],试试这个:

[[NSApplication sharedApplication] setDelegate: mydelegate];

如果不建立这种联系,应用程序将不知道应该由谁来处理委托职责。

或者

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

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

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

于 2013-11-08T18:22:36.657 回答
0

在您获取文件路径的方法中包含这一行:-

//Include this line for calling your method
[self application:[NSApplication sharedApplication]openFile:filename];
于 2013-10-29T11:12:10.937 回答
0

如果您有一个 AppleEvent 事件处理程序正在侦听'odoc'Open Document Apple 事件:

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

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

于 2019-08-23T00:41:50.227 回答