有没有办法使默认的NSDragOperation Move仍然允许复制?

时间:2016-06-25 15:50:43

标签: swift cocoa drag-and-drop

在某些应用程序(例如GarageBand)中,初始拖动操作为“移动”,如果在拖动时按下Option键,则支持“复制”。 我尝试了几件事,但没有取得任何成功。如果在操作掩码中指定了.Copy,则它始终成为默认操作。这可能吗?

    func draggingSession(session: NSDraggingSession, sourceOperationMaskForDraggingContext context: NSDraggingContext) -> NSDragOperation {
    if context == NSDraggingContext.OutsideApplication
    {
        return .None
    }
    else
    {
        return [.Move,.Copy]
    }
}

3 个答案:

答案 0 :(得分:1)

返回NSDragOperation时,可以检查是否按下了ALT(Option)键。

示例:

clear/1

答案 1 :(得分:0)

您将保持draggingSession:sourceOperationMaskForDraggingContext:功能相同,因为它只会在拖动开始时调用,而大多数具有复制/移动功能的应用程序允许用户在拖动期间按下选项(更重要的是,而他们的光标在行/视图上。)

如果您使用NSDraggingDestination,则可以在draggingUpdated:中检查此选项密钥。

如果您使用的是NSTableViewNSOutlineView,则可以使用validateDrop:数据源方法检查此内容。

答案 2 :(得分:0)

我可以通过在NSDraggingSource中使用以下标志组合来实现此功能:

- (NSDragOperation) draggingSession:(NSDraggingSession *)session
  sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
  // This combination of flags gives the behaviour we want, somehow:
  //   - it uses move pointer by default (no plus)
  //   - plus appears when pressing Alt and drop is allowed
  //   - pointer stays unchanged when pressing Cmd and drop is allowed
  //   - pointer stays unchanged when pressing Ctrl and drop is not allowed
  //
  // If using NSDragOperationEvery, this is not the case as we then get
  // the plus pointer by default.
  return NSDragOperationCopy |
         NSDragOperationMove |
         NSDragOperationGeneric |
         NSDragOperationMove |
         NSDragOperationDelete;
}

(这是Objective-C,但我希望问题仍然清楚。)