10

ユーザーがファイルを Finder からメニューバー アイコンにドラッグして処理できるようにするアプリケーションを構築しようとしています。旅は進みましたが、この丘を登ることはできないようです。NSView をサブクラス化し、ドラッグ メッセージを実装してみました。

@interface CMDroppableView : NSView <NSMenuDelegate>

ドラッグ操作を受け入れるだけでなく、ユーザーがアイコンをクリックしたときに NSMenu を提供したいと考えていました。NSMenu を適切に表示することはできましたが、ドラッグ機能はわかりにくいままです。

ここで行った受け入れられたドラッグタイプを登録する必要があることは私の理解です:

-(void)awakeFromNib{
[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
}

ドラッグ メッセージ:

-(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
    NSLog(@"Drag Enter");
    return NSDragOperationCopy;
}

-(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
    return NSDragOperationCopy;
}

-(void)draggingExited:(id <NSDraggingInfo>)sender{
    NSLog(@"Drag Exit");
}

-(BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender{
     return YES;
}

-(BOOL)performDragOperation:(id <NSDraggingInfo>)sender{
    return YES;
}

カスタムビューが設定されているコードは次のとおりです。

statusItemView = [[CMDroppableView alloc] init];
[statusItemView retain];
[statusItemView setMenu: statusMenu];

[statusItem setView: statusItemView];   

まだ何もありません。では、どこで間違ったのでしょうか。

ありがとう!

4

2 に答える 2

6

編集: おっと、ドラッグ タイプを に登録していますが-awakeFromNib、ビューがペン先から読み込まれていない場合は呼び出されません。-initWithFrame:代わりにドラッグの種類を登録してみてください!

古い答え:

IIRC では、ステータス項目にメニューを設定する必要はありません。私がしていることは、カスタム ビューでメニューを管理し、次のようなことを行うことです。

- (void)setMenu:(NSMenu *)menu {
    [menu setDelegate:self];
    [super setMenu:menu];
}

- (void)mouseDown:(NSEvent *)event {
    [statusItem popUpStatusItemMenu:[self menu]]; // or another method that returns a menu
}

- (void)menuWillOpen:(NSMenu *)menu {
    highlight = YES;
    [self setNeedsDisplay:YES];
}

- (void)menuDidClose:(NSMenu *)menu {
    highlight = NO;
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)rect {
    NSImage *img = highlight ? [alternateImage copy] : [image copy];
    NSRect bounds = [self bounds];
    [statusItem drawStatusBarBackgroundInRect:bounds withHighlight:highlight];
    
    // rest of drawing code goes here, including drawing img where appropriate
}

私のカスタムビューの実装で。これにより、メニューの動作がデフォルトと同じになります。

于 2011-05-15T04:41:40.400 に答える