4

私のアプリケーションでは、メインウィンドウとステータスアイテムの両方にドラッグできます。

  • スタックからウィンドウにファイルをドラッグすると、完全に機能します。
  • Finderからウィンドウにファイルをドラッグすると、完全に機能します。
  • Finderからステータスアイテムにファイルをドラッグすると、完全に機能します。
  • スタックからステータスアイテムにファイルをドラッグすると、機能しません。

ウィンドウとステータスアイテムの両方で、まったく同じドラッグアンドドロップ処理コードが使用されます。

面白いことに、ファイルをスタックからステータスアイテムにドラッグすると、-(NSDragOperation)draggingEntered:(id)sender {NSPasteboard * pboard;が原因で、カーソルが期待どおりに変化します。NSDragOperation sourceDragMask; メソッドは期待どおりに呼び出されます。

ただし、ファイルがドロップされると、-(BOOL)performDragOperation:(id)sender {NSPasteboard * pboard; NSDragOperation sourceDragMask; メソッドは呼び出されません。

最初のメソッドの実装は次のとおりです。

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];

    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        if (sourceDragMask & NSDragOperationGeneric) {
            return NSDragOperationGeneric;
        }
    }
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        if (sourceDragMask & NSDragOperationLink) {
            return NSDragOperationLink;
        } else if (sourceDragMask & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }

    return NSDragOperationNone;
}

ありがとう!

4

2 に答える 2

6

これは正当な問題です。これに関するバグレポートを Apple に提出しました。http://openradar.appspot.com/radar?id=1745403

そんな中、回避策を思いつきました。performDragOperation:が呼び出されることはありませんが、dragEnded : は呼び出されます。「draggingLocation」ポイントが NSView の矩形内にあるかどうかを確認することで、ファイルが NSStatusItem にドロップされたかどうかを確認できます。次に例を示します。

- (void)draggingEnded:(id<NSDraggingInfo>)sender
{
    if(NSPointInRect([sender draggingLocation],self.frame)){
        //The file was actually dropped on the view so call the performDrag manually
        [self performDragOperation:sender];
    }
}

バグが修正されるまで、これが役立つことを願っています。

于 2012-05-30T23:53:59.307 に答える