0

我有一个在网格中显示大量文本字段的 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")
        }
    }
}
4

0 回答 0