2017-09-04 2 views
0

J'essaye d'exécuter une action après avoir déposé une image sur un glisser-déposer NSImageView, mais cela ne fonctionne pas. Comment puis-je contrôler les opérations de glisser-déposer? J'ai le logoFornecedorImageView qui est une sortie NSImageView. Ma classe hérite de NSDraggingDestinatio et les types glissés sont enregistrés, mais lorsque je lance le logiciel et que je fais glisser une image dessus, rien ne se passe, rien n'est imprimé dans la console.Swift OSX NSImageView glisser et déposer

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)' est à nouveau les types enregistraient enregistrés. Cela n'a pas de sens. Essayez 'NSImage.imageTypes()'. – Willeke

+0

Ok, mais ça ne marche toujours pas. Maintenant, je suis passé à 'logoFornecedorImageView.register (forDraggedTypes: NSImage.imageTypes())' et quand je glisse et dépose l'image rien n'est écrit dans la console. – GuiDupas

+1

Les méthodes 'NSDraggingDestination' sont appelées dans l'affichage de l'image. Implémentez ces méthodes dans une sous-classe de 'NSImageView'. Ou si vous voulez uniquement effectuer et action, utilisez la méthode d'action de la vue d'image, qui est également appelée sur d'autres modifications. La vue de l'image doit être modifiable. – Willeke

Répondre

0

Merci à tous

Je viens au moins une action et il a bien fonctionné.

@IBAction func logoFornecedorImageDropped(_ sender: NSImageView) { 

     self.logoFornecedorSelecionada = true 
    }