Swift OSX NSImageView拖放

问题描述:

我想在拖放图像后执行一个操作,拖放NSImageView但它不工作。我如何控制拖放操作?Swift OSX NSImageView拖放

我有logoFornecedorImageView这是一个NSImageView插座。我的类继承自NSDraggingDestinatio并且拖拽的类型被注册,但是当我运行该软件并在其上拖动图像时,没有任何反应,控制台上没有任何内容。

import Cocoa 

class InserirFornecedorViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, NSDraggingDestination { 

    @IBOutlet weak var tituloJanelaLabel: NSTextField! 
    @IBOutlet weak var logoFornecedorImageView: NSImageView! 
    @IBOutlet weak var nomeFornecedorTextField: NSTextField! 
    @IBOutlet weak var materialFornecidoTextField: NSTextField! 
    @IBOutlet weak var materiaisTableView: NSTableView! 
    @IBOutlet weak var indicadorAtividadeProgressIndicator: NSProgressIndicator! 
    @IBOutlet weak var salvarFornercedorButton: NSButton! 

    var fornecedor: Fornecedor? 

    var logoFornecedorSelecionada = false 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     materiaisTableView.dataSource = self 
     materiaisTableView.delegate = self 

     logoFornecedorImageView.register(forDraggedTypes: logoFornecedorImageView.registeredDraggedTypes) 

     fornecedor = Fornecedor() 
    } 

    func draggingEnded(_ sender: NSDraggingInfo?) { 

     print("END") 
     logoFornecedorSelecionada = true 
    } 

    func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { 

     print("ENTERED") 
     return .generic 
    } 

    func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation { 

     print("UPDATED") 
     return .generic 
    } 

    func performDragOperation(_ sender: NSDraggingInfo) -> Bool { 

     return true 
    } 

    func numberOfRows(in tableView: NSTableView) -> Int { 

     return fornecedor?.materiais.count ?? 0 
    } 

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

     var cell: NSTableCellView? 

     //if tableColumn == tableView.tableColumns[0] 

     if fornecedor?.materiais.count != 0 { 
      let identificadorCell = "materialCellView" 

      let material = fornecedor?.materiais[row] 

      cell = tableView.make(withIdentifier: identificadorCell, owner: nil) as? NSTableCellView 

      cell?.textField?.stringValue = material! 
     } 

     return cell 
    } 

    @IBAction func selecionarImagemButtonClicked(_ sender: NSButton) { 

     let panel = NSOpenPanel() 
     panel.canChooseFiles = true 
     panel.canChooseDirectories = false 
     panel.allowsMultipleSelection = false 
     panel.canCreateDirectories = false 
     //panel.allowedFileTypes = ["jpg","png","pct","bmp", "tiff"] 
     panel.allowedFileTypes = NSImage.imageTypes() 

     panel.beginSheetModal(for: view.window!) { (result) in 

      if result == NSFileHandlingPanelOKButton { 
       self.logoFornecedorImageView.image = NSImage(byReferencing: panel.url!) 

       self.logoFornecedorSelecionada = true 
      } 
     } 
    } 

    @IBAction func removerImagemButtonClicked(_ sender: NSButton) { 

     logoFornecedorImageView.image = NSImage(named: "LogoImagemTexto") 

     logoFornecedorSelecionada = false 
    } 

    @IBAction func adicionarMaterialButton(_ sender: NSButton) { 

     if materialFornecidoTextField.stringValue.isEmpty { 
      mostrarErro(mensagem: "Erro de preenchimento", informativo: "Informe o material") 
      materialFornecidoTextField.becomeFirstResponder() 
     } else { 
      fornecedor?.materiais.append(materialFornecidoTextField.stringValue) 

      materialFornecidoTextField.stringValue = "" 

      fornecedor?.materiais.sort { 
       $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending 
      } 
      materiaisTableView.reloadData() 
     } 
    } 

    @IBAction func voltarButton(_ sender: NSButton) { 

     //let usarSoftViewController = presenting as! UsarSoftViewController 
     //usarSoftViewController.ativarBoxPrincipal() 
     //usarSoftViewController.usuario = usuario 
     //usarSoftViewController.fazerLogin() 

     dismiss(self) 
    } 

    func mostrarErro(mensagem: String, informativo: String) { 

     let alert = NSAlert() 
     alert.messageText = mensagem 
     alert.informativeText = informativo 
     alert.addButton(withTitle: "Fechar") 
     alert.alertStyle = .critical 
     alert.runModal() 
    } 
} 
+0

'logoFornecedorImageView.register(forDraggedTypes:logoFornecedorImageView.registeredDraggedTypes)'正在注册注册类型。这没有意义。试试'NSImage.imageTypes()'。 – Willeke

+0

好吧,但它仍然无法正常工作。现在我更改为'logoFornecedorImageView.register(forDraggedTypes:NSImage.imageTypes())',当我拖放图像时,没有任何东西写在控制台中。 – GuiDupas

+1

在图像视图上调用'NSDraggingDestination'方法。在“NSImageView”的子类中实现这些方法。或者,如果您只想执行和操作,则使用图像视图的操作方法,该方法也会在其他编辑中调用。图像视图必须是可编辑的。 – Willeke

谢谢大家

我刚执行的操作,它工作得很好。

@IBAction func logoFornecedorImageDropped(_ sender: NSImageView) { 

     self.logoFornecedorSelecionada = true 
    }