Swift NSTATUSBRITEM,使按钮支持拖放;滴
我知道有很多类似的问题,但它们都非常过时,基本上我有一个Swift NSTATUSBRITEM,使按钮支持拖放;滴,swift,macos,cocoa,nsstatusitem,Swift,Macos,Cocoa,Nsstatusitem,我知道有很多类似的问题,但它们都非常过时,基本上我有一个statusBarItem,我想让它对拖放文件做出响应,下面是我尝试过的一些代码: 扩展NSStatusBarButton{ 打开覆盖函数prepareForDragOperation(u发送方:nsDragginInfo)->Bool{ 真的 } 打开覆盖函数DragginGeted(u发送方:NSDragginInfo)->NSDragOperation{ 打印(“拖动输入”) 返回,收到 } 打开覆盖函数performDragOper
statusBarItem
,我想让它对拖放文件做出响应,下面是我尝试过的一些代码:
扩展NSStatusBarButton{
打开覆盖函数prepareForDragOperation(u发送方:nsDragginInfo)->Bool{
真的
}
打开覆盖函数DragginGeted(u发送方:NSDragginInfo)->NSDragOperation{
打印(“拖动输入”)
返回,收到
}
打开覆盖函数performDragOperation(u发送方:nsDragginInfo)->Bool{
打印(“有东西被拖走了!”)
返回真值
}
打开覆盖功能拖动(发送方:NSDraggingInfo){
打印(“拖动结束”)
}
}
类DragAndDropButton:NSStatusBarButton{
打开覆盖函数prepareForDragOperation(u发送方:nsDragginInfo)->Bool{
真的
}
打开覆盖函数DragginGeted(u发送方:NSDragginInfo)->NSDragOperation{
打印(“拖动输入”)
返回,收到
}
打开覆盖函数performDragOperation(u发送方:nsDragginInfo)->Bool{
打印(“有东西被拖走了!”)
返回真值
}
打开覆盖功能拖动(发送方:NSDraggingInfo){
打印(“拖动结束”)
}
}
@非应用程序主
类AppDelegate:NSObject,NSApplicationDelegate{
变量窗口:NSWindow!
var popover:NSPopover!
var statusBarItem:NSStatusItem!
func ApplicationIDFinishLaunching(通知:通知){
//创建SwiftUI视图并将上下文设置为managedObjectContext环境键路径的值。
//在需要上下文的视图中添加“@Environment(\.managedObjectContext)”。
让popoverView=popoverView()
popover=nspover()
popover.contentSize=NSSize(宽度:AppConstants.PopoOverWidth,高度:AppConstants.PopoOverHeight)
popover.animates=true
popover.behavior=.transient
popover.contentViewController=NSHostingController(根视图:popoverView)
statusBarItem=NSStatusBar.system.statusItem(带长度:CGFloat(NSStatusItem.variableLength))
让dropSubview=DragAndDropButton()
dropSubview.RegisterForDragedTypes([.png])
dropSubview.image=NSImage(名为:“CognitionSmall”)
statusBarItem.button=下降
//statusBarItem.view=dropSubview
//statusBarItem.title=“测试”
如果let button=self.statusBarItem.button{
//按钮视图
//button.RegisterForDragedTypes([.multipleTextSelection])
按钮。addSubview(dropSubview)
button.imagePosition=NSControl.imagePosition.imageLeft
button.image=NSImage(名为:“CognitionSmall”)
button.action=#选择器(切换切换切换(:))
//button.window!.delegate=self
//addSubview(cognitoSubview)按钮
//button.performDragOperation=#选择器(onDrag(:))
}
}
正如您所见,我试图扩展和覆盖默认的
NSStatusBarButton
行为,并将其替换为我自己的NSView
并向按钮添加子视图,但似乎没有任何效果,有人知道如何使其工作吗?这在我的系统上使用命令行工作(没有在Xcode中尝试过)
结果表明,我对NSStatusBarButton所做的扩展很好,唯一的例外是我没有正确地测试它,如果您声明更多注册类型,它就可以正常工作:
扩展NSStatusBarButton{
打开覆盖函数prepareForDragOperation(u发送方:nsDragginInfo)->Bool{
真的
}
打开覆盖函数DragginGeted(u发送方:NSDragginInfo)->NSDragOperation{
打印(“拖动输入”)
返回,收到
}
打开覆盖函数performDragOperation(u发送方:nsDragginInfo)->Bool{
打印(“有东西被拖走了!”)
返回真值
}
打开覆盖功能拖动(发送方:NSDraggingInfo){
打印(“拖动结束”)
}
}
…更多初始化代码
registerForDragedTypes([.fileURL、.multipleTextSelection、.png])
@Oscar-我修改了您原来的帖子,可以确认以下代码将通过使用扩展为NSStatusBarButton添加拖放功能,并且它不需要NSView子视图。谢谢
import Cocoa
extension NSStatusBarButton {
open override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
true
}
open override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
print("Dragging entered.")
return .copy
}
open override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
print("Something was dragged!")
return true
}
open override func draggingEnded(_ sender: NSDraggingInfo) {
print("Dragging ended.")
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var statusItem: NSStatusItem!
func applicationDidFinishLaunching(_ aNotification: Notification) {
statusItem = NSStatusBar.system.statusItem(withLength: 100)
statusItem.button!.title = "DND Test"
statusItem.button!.registerForDraggedTypes([.fileURL])
}
}
let appDelegate = AppDelegate()
// **** main.swift **** //
let app = NSApplication.shared
app.setActivationPolicy(.regular)
app.delegate = appDelegate
app.activate(ignoringOtherApps:true)
app.run()
如果文件另存为statusItem.swift,则可通过以下方式从终端运行:
swiftc statusItem.swift-framework Cocoa-o statusItem&&./statusItem您是否尝试注册一个文件URL类型?
.png
是png图像数据。啊,我不知道,我以为是文件类型,我会尝试它。多亏了您,我尝试的扩展功能实际上起作用了无需绘制子视图,它只是未为NSButton声明为PropertyWorks的数据。
import Cocoa
extension NSStatusBarButton {
open override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
true
}
open override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
print("Dragging entered.")
return .copy
}
open override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
print("Something was dragged!")
return true
}
open override func draggingEnded(_ sender: NSDraggingInfo) {
print("Dragging ended.")
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var statusItem: NSStatusItem!
func applicationDidFinishLaunching(_ aNotification: Notification) {
statusItem = NSStatusBar.system.statusItem(withLength: 100)
statusItem.button!.title = "DND Test"
statusItem.button!.registerForDraggedTypes([.fileURL])
}
}
let appDelegate = AppDelegate()
// **** main.swift **** //
let app = NSApplication.shared
app.setActivationPolicy(.regular)
app.delegate = appDelegate
app.activate(ignoringOtherApps:true)
app.run()