【发布时间】:2023-04-04 11:14:01
【问题描述】:
我试图在拖放图像后执行操作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()
}
}
【问题讨论】:
-
logoFornecedorImageView.register(forDraggedTypes: logoFornecedorImageView.registeredDraggedTypes)正在重新注册已注册的类型。这没有意义。试试NSImage.imageTypes()。 -
好的,但是还是不行。现在我改为
logoFornecedorImageView.register(forDraggedTypes: NSImage.imageTypes()),当我拖放图像时,控制台中没有写入任何内容。 -
在图像视图上调用
NSDraggingDestination方法。在NSImageView的子类中实现这些方法。或者,如果您只想执行和操作,则使用图像视图的操作方法,在其他编辑时也会调用该方法。图像视图必须是可编辑的。 -
你应该简单地继承 NSImageView 或 NSView 的拖放操作。
-
如何在没有子类化
NSView的情况下对我的ViewController执行删除操作?
标签: swift macos drag-and-drop nsimageview