在某些应用程序(例如GarageBand)中,初始拖动操作为“移动”,如果在拖动时按下Option键,则支持“复制”。 我尝试了几件事,但没有取得任何成功。如果在操作掩码中指定了.Copy,则它始终成为默认操作。这可能吗?
func draggingSession(session: NSDraggingSession, sourceOperationMaskForDraggingContext context: NSDraggingContext) -> NSDragOperation {
if context == NSDraggingContext.OutsideApplication
{
return .None
}
else
{
return [.Move,.Copy]
}
}
答案 0 :(得分:1)
返回NSDragOperation时,可以检查是否按下了ALT(Option)键。
示例:
clear/1
答案 1 :(得分:0)
您将保持draggingSession:sourceOperationMaskForDraggingContext:
功能相同,因为它只会在拖动开始时调用,而大多数具有复制/移动功能的应用程序允许用户在拖动期间按下选项(更重要的是,而他们的光标在行/视图上。)
如果您使用NSDraggingDestination
,则可以在draggingUpdated:
中检查此选项密钥。
如果您使用的是NSTableView
或NSOutlineView
,则可以使用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,但我希望问题仍然清楚。)