2015-07-27 13 views
9

2.0 sürükle-bırak bölgesi nasıl uygulanır?os x Swift: sürükle ve bırak yöntemini kullanarak dosya yolunu elde edin

kext dosyalarını işleyen bir uygulama geliştirdim, ancak şimdilik, giriş kext'ine giden yolu elle girmek zorundayım. sorum şu: bir bölgeye sürükleyip bırakarak dosya yolu nasıl alınır?

+2

olası kopya Sizin "MacOS Dağıtım Target" belirlemek zorunda bu kodu kullanmak için: // stackoverflow.com/questions/29233247/implementing-a-drag-and-drop-zone-in-swift) –

cevap

15

[Swift 4.0 ve Xcode 9'a Güncelleme]

ana görünümü ve alt sınıfa bir NSView ekleyin. Bu kod, Swift 4.0 ve macOS 10.13 High Sierra'da mükemmel çalışır!

import Cocoa 

class DropView: NSView { 

    var filePath: String? 
    let expectedExt = ["kext"] //file extensions allowed for Drag&Drop (example: "jpg","png","docx", etc..) 

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 

     self.wantsLayer = true 
     self.layer?.backgroundColor = NSColor.gray.cgColor 

     registerForDraggedTypes([NSPasteboard.PasteboardType.URL, NSPasteboard.PasteboardType.fileURL]) 
    } 

    override func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 
     // Drawing code here. 
    } 

    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 
     if checkExtension(sender) == true { 
      self.layer?.backgroundColor = NSColor.blue.cgColor 
      return .copy 
     } else { 
      return NSDragOperation() 
     } 
    } 

    fileprivate func checkExtension(_ drag: NSDraggingInfo) -> Bool { 
     guard let board = drag.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray, 
       let path = board[0] as? String 
     else { return false } 

     let suffix = URL(fileURLWithPath: path).pathExtension 
     for ext in self.expectedExt { 
      if ext.lowercased() == suffix { 
       return true 
      } 
     } 
     return false 
    } 

    override func draggingExited(_ sender: NSDraggingInfo?) { 
     self.layer?.backgroundColor = NSColor.gray.cgColor 
    } 

    override func draggingEnded(_ sender: NSDraggingInfo) { 
     self.layer?.backgroundColor = NSColor.gray.cgColor 
    } 

    override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { 
     guard let pasteboard = sender.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? NSArray, 
       let path = pasteboard[0] as? String 
     else { return false } 

     //GET YOUR FILE PATH !!! 
     self.filePath = path 
     Swift.print("FilePath: \(path)") 

     return true 
    } 
} 

(http [Swift bir sürükle ve bırak bölgesini Uygulama] arasında 10,13

screenshot

+1

Teşekkürler M.Moro. Ve Apple doc burada: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DragandDrop/Tasks/DraggingFiles.html –

+0

Programlı olarak ve daha özel olarak 'kodlayıcı için ne geçmesi gerektiği nasıl oluşturulur: NSCoder '? – fips

+1

@fips Üzgünüz, ama sorunuzu anlamadım. Ayrıca bir DropView sınıfı örneği programlı olarak oluşturabilir veya bir StoryView'a bir NSView alt sınıfını da ekleyebilirsiniz. Init? (Kodlayıcı: NSCoder) super.init (kodlayıcı: kodlayıcı) unutma. –