【发布时间】:2020-12-13 21:16:50
【问题描述】:
我正在为 SwiftUI 中的 macOS 菜单/状态栏制作一个应用程序,单击该应用程序会打开一个 NSPopover。该应用程序以TextEditor(Big Sur 中的新功能)为中心,但TextEditor 似乎没有响应用于复制、粘贴和剪切的典型 Cmd + C/V/X 键盘快捷键。我知道TextEditors 确实支持这些快捷方式,因为如果我在 XCode 中开始一个新项目并且我没有将它放在 NSPopover 中(例如,我只是将它放入普通的 Mac 应用程序中),它就可以工作。复制/粘贴/剪切选项仍然出现在右键菜单中,但我不知道为什么我不能使用键盘快捷键在NSPopover 中访问它们。
我认为这与当您单击打开弹出框时,macOS 不会“关注”应用程序这一事实有关。通常,当您打开应用程序时,您会在 Mac 菜单栏的左上方(Apple 徽标旁边)看到应用程序名称和相关菜单选项。我的应用没有这样做(可能是因为它是一个弹出框)。
以下是相关代码:
ContentView.swift 中的文本编辑器:
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
【问题讨论】:
-
那你在问什么?当用户从编辑菜单中选择复制/剪切/粘贴时,您想运行代码吗?考虑到编辑菜单不属于您的应用,这没有任何意义。
-
@LeoDabus 我希望用户能够使用典型的键盘快捷键 (Cmd + C/V/X) 在 TextEditor 中复制/粘贴/剪切文本。
-
我发现了一个非常相似的问题 (stackoverflow.com/questions/49637675/…),但唯一的答案已经过时,我不确定如何为 Big Sur/最新版本的 Swift 实现它。
标签: swift macos swiftui macos-big-sur