2017-09-04 16 views
0

ドラッグアンドドロップでイメージをドロップした後にアクションを実行しようとしていますが、動作していません。ドラッグアンドドロップ操作をどのように制御できますか?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

答えて

0

おかげでみんな

私はアクションを実行し、それがうまく働きました。

@IBAction func logoFornecedorImageDropped(_ sender: NSImageView) { 

     self.logoFornecedorSelecionada = true 
    } 
関連する問題