2015-07-27 12 views
9

jak zaimplementować strefę przeciągania i upuszczania w swift 2.0?os x Swift: pobierz ścieżkę pliku za pomocą przeciągania i upuszczania

Zbudowałem aplikację, która przetwarza pliki kext, ale na razie muszę ręcznie wprowadzić ścieżkę do pliku wejściowego kext. moje pytanie brzmi: jak uzyskać ścieżkę pliku, wykonując przeciągnij i upuść na strefie?

+2

możliwym duplikatu [Wdrożenie strefy przeciągnij i upuść w Swift] (http: // stackoverflow.com/questions/29233247/implementing-a-drag-and-drop-zone-in-swift) –

Odpowiedz

15

[Aktualizacja Swift 4.0 i Xcode 9]

Dodaj NSView do widoku głównego i podklasy. Ten kod działa idealnie w Swift 4.0 i macOS 10.13 High Sierra!

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 
    } 
} 

Aby użyć tego kodu trzeba ustawić "MacOS Deployment docelowej" do 10.13

screenshot

+1

Dzięki M.Moro. A dokumentacja Apple znajduje się tutaj: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DragandDrop/Tasks/DraggingFiles.html –

+0

Jak utworzyć instancję tego programu, a dokładniej, co przekazać dla 'coder: NSCoder '? – fips

+1

@fips Przepraszamy, ale nie zrozumiałem Twojego pytania. Możesz także programowo utworzyć instancję klasy DropView lub podklasę NSView w Storyboard. W init? (Koder: NSCoder) nie zapomnij super.init (koder: koder). –

Powiązane problemy