我正在使用SwiftUI为macOS菜单/状态栏制作一个应用程序,当点击它时,会打开一个NSPopover。该应用程序以TextEditor(在Big Sur中新增)为中心,但是该TextEditor似乎不响应通常的Cmd+C/V/X键盘快捷键进行复制、粘贴和剪切。我知道TextEditor支持这些快捷键,因为如果我在XCode中启动一个新项目,并且不将其放入NSPopover中(例如,我只将其放入普通的Mac应用程序中),那么它就可以工作。复制/粘贴/剪切选项仍然出现在右键菜单中,但我不确定为什么不能使用键盘快捷键在NSPopover中访问它们。
我认为这与当您单击以打开popover时,macOS没有“聚焦”于应用程序有关。通常,当您打开应用程序时,您会在Mac菜单栏的左上角(靠近Apple徽标)看到应用程序名称和相关菜单选项。我的应用程序不会这样做(可能是因为它是一个popover)。
以下是相关代码:
ContentView.swift中的TextEditor:
我认为这与当您单击以打开popover时,macOS没有“聚焦”于应用程序有关。通常,当您打开应用程序时,您会在Mac菜单栏的左上角(靠近Apple徽标)看到应用程序名称和相关菜单选项。我的应用程序不会这样做(可能是因为它是一个popover)。
以下是相关代码:
ContentView.swift中的TextEditor:
TextEditor(text: $userData.note)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.padding(10)
.font(.body)
.background(Color(red: 30 / 255, green: 30 / 255, blue: 30 / 255))
在NotedApp.swift中的NSPopover逻辑:
@main
struct MenuBarPopoverApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
Settings{
EmptyView()
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
var popover = NSPopover.init()
var statusBarItem: NSStatusItem?
func applicationDidFinishLaunching(_ notification: Notification) {
let contentView = ContentView()
popover.behavior = .transient
popover.animates = false
popover.contentViewController = NSViewController()
popover.contentViewController?.view = NSHostingView(rootView: contentView)
statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
statusBarItem?.button?.title = "Noted"
statusBarItem?.button?.action = #selector(AppDelegate.togglePopover(_:))
}
@objc func showPopover(_ sender: AnyObject?) {
if let button = statusBarItem?.button {
popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
}
}
@objc func closePopover(_ sender: AnyObject?) {
popover.performClose(sender)
}
@objc func togglePopover(_ sender: AnyObject?) {
if popover.isShown {
closePopover(sender)
} else {
showPopover(sender)
}
}
}
您可以在此GitHub存储库中找到整个应用程序:https://github.com/R-Taneja/Noted