【问题标题】:Swift: Opening a file by drag-and-drop in windowSwift:通过在窗口中拖放打开文件
【发布时间】:2014-12-25 05:27:33
【问题描述】:

在 Swift 中,我如何在我的 Mac 应用程序的窗口中构建一个区域,用户可以将文件夹拖放到该区域,并让我的应用程序接收文件夹的路径?

在我看来,原则上这与 Apple 的 CocoaDragAndDrop example 应用程序的概念相似。我试图通过理解源代码来工作,但该应用程序是用 Objective-C 编写的,我没有成功地在我正在构建的应用程序中复制它的功能。

提前谢谢你。

【问题讨论】:

  • 您遇到过这个问题吗?如果你这样做了,那么如果你能将你的解决方案发布给其他人(比如我!),那就太好了。
  • @JavaNut13 不!我一直没能找到解决办法。我设法允许用户通过在 Xcode 中将相关的Document Types 添加到我的目标,然后将func application(sender: NSApplication, openFile theDroppedFilePath: String) { PROCESS YOUR FILES HERE } 添加到我的 AppDelegate.swift 来允许用户将文件/文件夹拖放到我的应用程序的停靠图标上。希望这会有所帮助!
  • 如果我解决了,我想我会在这里发布答案。
  • 请注意,在 Cocoa Drag&Drop 示例中,您可以注释掉“registerForDraggedTypes”并且它仍然可以工作...因为它是 NSImageView 的默认功能...因此在 swift 中,如果您使用NSImageView,它至少也适用于图像。我仍在寻找 NSView 上拖放功能的工作示例(Swift 或 Obj C)。我永远无法让 registerForDraggedTypes 工作......

标签: macos swift


【解决方案1】:

在自定义 NSView 中:

override init(frame frameRect: NSRect)
{
    super.init(frame: frameRect)
    registerForDraggedTypes([kUTTypeFileURL,kUTTypeImage])
}

override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation
{
    println("dragging entered")
    return NSDragOperation.Copy
}

关键是,为了让它工作,我必须把自定义视图作为叶子和故事板中的最后一个视图

【讨论】:

  • 天啊。谢谢你最后的注释!我快疯了,因为我在目标视图中有一个 Imageview。
  • 而不是init,您应该将注册调用放在awakeFromNib。否则你会听到 Swift 的呱呱叫声。
【解决方案2】:

这对我有用(在 NSWindow 子类上):

在 awakeFromNib 中:

registerForDraggedTypes([NSFilenamesPboardType])

然后在窗口(或视图)中添加以下操作(至少 draggingEntered 和 performDragOperation):

func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation {
    let sourceDragMask = sender.draggingSourceOperationMask()
    let pboard = sender.draggingPasteboard()!
    if pboard.availableTypeFromArray([NSFilenamesPboardType]) == NSFilenamesPboardType {
        if sourceDragMask.rawValue & NSDragOperation.Generic.rawValue != 0 {
            return NSDragOperation.Generic
        }
    }
    return NSDragOperation.None
}

func draggingUpdated(sender: NSDraggingInfo) -> NSDragOperation {
    return NSDragOperation.Generic
}

func prepareForDragOperation(sender: NSDraggingInfo) -> Bool {
    return true
}

func performDragOperation(sender: NSDraggingInfo) -> Bool {
   // ... perform your magic
   // return true/false depending on success
}

【讨论】:

    【解决方案3】:

    我为 OSX 支付的 2 美分 - swift 5(并已修复从 XIBs/storybord 加载。)

    //  Created by ing.conti on 31th jan 2020.
    //
    
    import Cocoa
    
    class AnalysisView: NSView {
    
        override init(frame frameRect: NSRect)
        {
            super.init(frame: frameRect)
            self.registerMyTypes()
        }
    
        required init?(coder: NSCoder) {
            super.init(coder: coder)
            self.registerMyTypes()
        }
    
    
        final private func registerMyTypes()
        {
            registerForDraggedTypes(
                [NSPasteboard.PasteboardType.URL,
                 NSPasteboard.PasteboardType.fileURL,
                 NSPasteboard.PasteboardType.png,
                 NSPasteboard.PasteboardType.fileNameType(forPathExtension: "wtf")
            ])
        }
    
    
    
        override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
            print("draggingEntered")
            return NSDragOperation.copy
        }
    
        override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
            let allow = true // check your types...
            print("prepareForDragOperation")
            return allow
        }
    
        override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
    
            let pasteBoard = sender.draggingPasteboard
            print("performDragOperation")
    
            if let urls = pasteBoard.readObjects(forClasses: [NSURL.self]) as? [URL]{
                // consume them...
                print(urls)
                return true
            }
            return false
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2015-09-04
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      相关资源
      最近更新 更多