在SwiftUI中禁用macOS聚焦环

7
在 SwiftUI for Mac 上,是否有可能禁用围绕 TextField 的焦点环?
2个回答

6

我也有同样的问题,经过几个小时的尝试,似乎答案是否定的。但是,可以将NSTextField包装起来并摆脱焦点环。

以下代码已在最新版本中进行过测试。

struct CustomTextField: NSViewRepresentable {
    @Binding var text: String

    init(text: Binding<String>) {
        _text = text
    }

    func makeNSView(context: Context) -> NSTextField {
        let textField = NSTextField(string: text)
        textField.delegate = context.coordinator
        textField.isBordered = false
        textField.backgroundColor = nil
        textField.focusRingType = .none
        return textField
    }

    func updateNSView(_ nsView: NSTextField, context: Context) {
        nsView.stringValue = text
    }

    func makeCoordinator() -> Coordinator {
        Coordinator { self.text = $0 }
    }

    final class Coordinator: NSObject, NSTextFieldDelegate {
        var setter: (String) -> Void

        init(_ setter: @escaping (String) -> Void) {
            self.setter = setter
        }

        func controlTextDidChange(_ obj: Notification) {
            if let textField = obj.object as? NSTextField {
                setter(textField.stringValue)
            }
        }

    }

}

4

正如Asperi在类似问题的回答中所述这里,使用SwiftUI无法(目前)关闭特定字段的焦点环;然而,以下解决方案将禁用应用程序中所有NSTextField实例的焦点环:

extension NSTextField {
    open override var focusRingType: NSFocusRingType {
        get { .none }
        set { }
    }
}

虽然不是最理想的解决方案,但它提供了一种不需要过度依赖 SwiftUI 的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接