2017-09-04 10 views
0

끌어서 놓기 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

답변

0

덕분에 모두

난 그냥 작업을 수행하고 괜찮 았는데.

@IBAction func logoFornecedorImageDropped(_ sender: NSImageView) { 

     self.logoFornecedorSelecionada = true 
    }