我遇到了一个简单的SwiftUI视图包含TextField
的问题.
如果View
在SwiftUI App > Scene > WindowGroup
中,视图中的TextField
将按照预期运行,我可以使用TextField
中的快捷方式(如Command+a
)来 Select TextField
或copy/past
中的所有文本.
如果View
在通过编程创建的NSWindow
中被设置为contentView
的NSHostingView
中,我的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)
}
}
[EDIT]个
我做了更多的测试.
如果一切都是使用界面生成器创建的(将NSTextField
拖放到NSView
中),它也会按预期工作.
如果我们以编程方式创建NSView
并添加NSTextField
,这里同样不起作用:
// Not working code
func applicationDidFinishLaunching(_ aNotification: Notification)
{
NSApplication.shared.activate(ignoringOtherApps: true)
window = NSWindow(contentRect: NSRect(x: 400, y: 400, width: 400, height: 100), styleMask: [.miniaturizable, .closable, .resizable, .titled], backing: .buffered, defer: false)
window.center()
window.title = "Title"
window.contentView = NSView(frame: NSRect(x: 0, y: 0, width: 300, height: 300))
let textField = NSTextField(frame: NSRect(x: 0, y: 0, width: 250, height: 60))
window.contentView?.addSubview(textField)
window.makeKeyAndOrderFront(nil)
}
我怀疑它与福克斯或firstResponder
有关,但我无法让它发挥作用.欢迎任何帮助.谢谢!