2015-05-07 58 views
2

我很努力地將從拖放(從finder到NSView文件)接收到的變量傳遞給AppDelegate中的NSArrayController。拖放到NSArrayController

的NSView接收拖放:

class MyView:NSView, NSDraggingDestination { 

    override func drawRect(dirtyRect: NSRect) { 
     super.drawRect(dirtyRect) 
    } 

    let fileTypes = ["jpg", "jpeg", "bmp", "tif", "TIF"] 
    var fileTypeIsOk = false 
    var droppedFilePath = "" 


    required init?(coder: NSCoder) { 
     let types = [NSFilenamesPboardType, NSURLPboardType, NSPasteboardTypeTIFF] 
     super.init(coder: coder) 
     registerForDraggedTypes(types) 
    } 
    override func draggingEntered(sender: NSDraggingInfo) -> NSDragOperation { 

     if checkExtension(sender) == true { 
      fileTypeIsOk = true 
      return .Every 
     } else { 
      fileTypeIsOk = false 
      println("Dropped images rejected.") 
      return .None 
     } 
    } 
    override func performDragOperation(sender: NSDraggingInfo) -> Bool { 

     var go = false 
     if let board = sender.draggingPasteboard().propertyListForType("NSFilenamesPboardType") as? NSArray {    
      for indexFile in 0...board.count-1 { 
       println("Files dropped \(board[indexFile])") 
       //-> pass the variable board[indexFile] or board[] to NSArrayController 

       go = true 
      } 
     } 
     return go 
    } 

    func checkExtension(drag: NSDraggingInfo) -> Bool { 
     var go = false 
     var foundExtension = 0 
     var numberOfFiles = 0 

     if let board = drag.draggingPasteboard().propertyListForType("NSFilenamesPboardType") as? NSArray { 
      numberOfFiles = board.count 
      for indexFile in 0...numberOfFiles-1 { 
       if let url = NSURL(fileURLWithPath: (board[indexFile] as! String)) { 
        let suffix = url.pathExtension! 
        for ext in fileTypes { 
         if ext.lowercaseString == suffix { 
          ++foundExtension 
          break 
         } 
        } 
       } 
      } 
     } 
     if foundExtension == numberOfFiles { 
      println("Dropped files have valid extension.") 
      go = true 
     } else { 
      println("At least one file dropped has an invalid extension.") 
     } 
     return go 
    } 
} 

在AppDelegate中,我已經建立了一個NSArrayController(指向目前的數據[],但我不知道如何填充從板數據[] [])

func numberOfRowsInTableView(aTableView: NSTableView) -> Int { 
    return data.count 
} 

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { 

    var cellView: NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView 

    println("Reload Array") 

    if tableColumn!.identifier == "fileNameColumn" { 
     cellView.imageView!.image = NSImage(named: "GreenCircle") 
     cellView.textField!.stringValue = data[row] 

     return cellView 
    } 

...

感謝你的幫助

回答

1

呼叫「 - (void)addObjects:(NSArray *)對象;」方法對您的NSArrayController的,並將它傳遞板:

[self.myArrayController addObjects:board]; 
+0

謝謝,問題是我在寫入時出現錯誤:self.droppedFilesControler.addObject(board) AppDelegate無法識別'board'。 'Board'是在MyView類中創建的。 –

+0

你需要將數組控制器放在NSView中,或者從AppDelegate中暴露它(通過在AppDelegate的頭文件中聲明它爲@property)。 – geowar

+0

在swift中沒有.h文件。我想從AppDelegate選項中暴露ArrayController,但不知道如何在swift中編寫它。再次感謝您的幫助。 –

0

它的工作通過的NSView加入:performDragOperation:

讓的appDelegate = NSApplication.sharedApplication()委託作爲! AppDelegate

然後我可以使用appDelegate.data到達'data'變量。