我有一个在网格中显示大量文本字段的 macOS SwiftUI 应用程序。最初我使用的是 SwiftUI TextField,但它们的问题是您无法设置它们的焦点顺序(按下选项卡按钮时它们接收焦点的顺序)。我需要将焦点顺序从水平逐行更改为垂直逐列。在 SwiftUI 中似乎没有一种简单的方法可以做到这一点。
我在这里找到了适用于 iOS 的解决方案,我尝试为 mac 进行修改。问题是委托函数没有被调用。我当前的代码如下。我该如何解决?
编辑:我已经根据一些评论更新了我的代码,但问题仍然存在:没有调用委托方法。
import SwiftUI
struct OrderedTextField: NSViewRepresentable {
@Binding var text: String
@Binding var selectedField: Int
var tag: Int
func makeNSView(context: NSViewRepresentableContext<OrderedTextField>) -> NSTextField {
let textField = NSTextField()
textField.delegate = context.coordinator
textField.tag = tag
textField.placeholderString = ""
return textField
}
func makeCoordinator() -> Coordinator {
Coordinator(text: $text)
}
func updateNSView(_ nsView: NSTextField, context: NSViewRepresentableContext<OrderedTextField>) {
context.coordinator.newSelection = { newSelection in
DispatchQueue.main.async {
self.selectedField = newSelection
}
}
if nsView.tag == self.selectedField {
nsView.becomeFirstResponder()
}
}
}
extension OrderedTextField {
class Coordinator: NSObject, NSTextFieldDelegate {
@Binding var text: String
var newSelection: (Int) -> () = { _ in }
init(text: Binding<String>) {
print("Initializing!")
_text = text
}
func textShouldBeginEditing(_ textObject: NSText) -> Bool {
print("Should begin editing!")
return true
}
func textDidBeginEditing(_ notification: Notification) {
print("Began editing")
}
func textDidChange(_ notification: Notification) {
print("textDidChange")
}
func textShouldEndEditing(_ textObject: NSText) -> Bool {
print("should end editing")
return true
}
func textDidEndEditing(_ notification: Notification) {
print("did end editing")
}
}
}