NSWindow 中以编程方式创建的 TextField 快捷方式与 SwiftUI 的比较

问题描述 投票:0回答:1

我在使用包含

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
有关,但我无法使其发挥作用。欢迎任何帮助。谢谢!

swift macos swiftui textfield nswindow
1个回答
0
投票

在工作版本中,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)
    }
}

您需要扩展它以包含其他快捷方式,例如复制和粘贴。

© www.soinside.com 2019 - 2024. All rights reserved.