Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSTATUSBRITEM,使按钮支持拖放;滴_Swift_Macos_Cocoa_Nsstatusitem - Fatal编程技术网

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()