我在使用包含
TextField
的简单 SwiftUI 视图时遇到问题。
如果
View
位于 SwiftUI App > Scene > WindowGroup
内,则视图中的 TextField
会按预期运行,我可以使用 TextField
内的快捷方式(例如 Command+a
)来选择其中的所有文本或 copy/past
。
如果
View
位于设置为以编程方式创建的 NSHostingView
的 contentView
的 NSWindow
内,则我的 TextField
不接受使用 Command
键的快捷方式。我仍然可以使用 CTRL
输入文本或使用快捷方式,但使用 Command
铃声响起,什么也没有发生。
这是工作版本的代码:
import Foundation
import SwiftUI
struct MyView: View {
@State var text = ""
var body: some View {
TextField("My textfield", text: $text).padding()
}
}
@main
struct TestCoreDataSwiftApp: App {
var body: some Scene {
WindowGroup {
MyView()
}
}
}
这是不工作版本的代码:
import Foundation
import Cocoa
import SwiftUI
let app = NSApplication.shared
let delegate = AppDelegate()
app.delegate = delegate
_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
struct MyView: View {
@State var text = ""
var body: some View {
TextField("My textfield", text: $text).padding()
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
private var window: NSWindow?
func applicationDidFinishLaunching(_ aNotification: Notification) {
window = NSWindow()
window?.contentView = NSHostingView(rootView: MyView())
window?.makeKeyAndOrderFront(self)
window?.makeFirstResponder(nil)
}
}
我怀疑这与焦点或
firstResponder
有关,但我无法使其发挥作用。欢迎任何帮助。谢谢!
在工作版本中,SwiftUI 原生处理键盘快捷键。
但是,在非工作版本中,
NSWindow
未配置为将 Command+a
等键盘快捷键传递到 NSHostingView
内托管的 SwiftUI 视图。
这意味着您需要确保您的
NSWindow
正确地将这些事件转发到 NSHostingView
。NSHostingView
并重写 performKeyEquivalent(_:)
方法来手动处理这些快捷方式。
import Foundation
import Cocoa
import SwiftUI
let app = NSApplication.shared
let delegate = AppDelegate()
app.delegate = delegate
_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
struct MyView: View {
@State var text = ""
var body: some View {
TextField("My textfield", text: $text).padding()
}
}
class CustomNSHostingView<Content>: NSHostingView<Content> where Content : View {
override func performKeyEquivalent(with event: NSEvent) -> Bool {
// Handle Command key shortcuts here
// Example: Command + a
if event.modifierFlags.contains(.command) {
if event.characters == "a" {
// Do something for Command + a
return true
}
// Add other command key shortcuts as needed
}
return super.performKeyEquivalent(with: event)
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
private var window: NSWindow?
func applicationDidFinishLaunching(_ aNotification: Notification) {
window = NSWindow()
window?.contentView = CustomNSHostingView(rootView: MyView())
window?.makeKeyAndOrderFront(self)
window?.makeFirstResponder(nil)
}
}
您需要扩展它以包含其他快捷方式,例如复制和粘贴。