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

プロジェクトの開始時に Xcode によって自動生成される AppDelegate クラスの一部として。

于 2013-11-08T18:22:36.657 に答える
0

'odoc'Open Document アップル イベントをリッスンする AppleEvent イベント ハンドラがある場合:

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

その後、ハンドラーは呼び出しをインターセプトし、通常の App Delegate メソッドは呼び出されません。

于 2019-08-23T00:41:50.227 に答える