在 SwiftUI 中禁用 macOS 对焦环

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

是否可以在 Mac 版 swiftUI 中禁用

TextField
周围的对焦环?

macos cocoa swiftui
3个回答
7
投票

我也有这个问题,经过几个小时的摆弄,答案似乎是否定的。但是,可以包装 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)
            }
        }

    }

}

5
投票

正如 Asperi 对类似问题 here 的回答所述,目前还无法使用 SwiftUI 关闭特定字段的对焦环;但是,以下解决方法将禁用应用程序中所有

NSTextField
实例的对焦环

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

并不理想,但它确实提供了一种不需要在 SwiftUI 之外走太远的选项。


0
投票

正如这个问题中的George Valkov所指出的,从iOS 17 / macOS 14开始,您可以将

.focusEffectDisabled
应用于特定子视图或整个视图。

TextField("Search", text: self.$searchText)
.focusEffectDisabled()
© www.soinside.com 2019 - 2024. All rights reserved.