Mac OS Swift UI 如何在Swift UI中灵活的使用NSTextField
效果
输入框a跟随b的内容而变化,输入框b也跟随a的内容变化而变化。
创建一个Swift UI中的输入框
创建一个输入框,并绑定一个text内容
struct ContentView: View {
@State var text = ""
var body: some View {
VStack {
Text("Custom TextField")
Group {
TextField("请输入文字", text: self.$text).padding()
}
}.frame(width: 300, height: 400, alignment: .center)
}
}
自定义一个NSTextField
绑定一个内容属性
@Binding var text: String
重写makeNSView
func makeNSView(context: NSViewRepresentableContext<MyTextField>) -> NSTextField {
//新建一个NSTextField
let textField = NSTextField()
textField.focusRingType = .none
textField.isBordered = false
textField.drawsBackground = true
**重要:**绑定代理
textField.delegate = context.coordinator
return textField
}
重写updateNSView
func updateNSView(_ nsView: NSTextField, context: NSViewRepresentableContext<MyTextField>) {
nsView.stringValue = text
}
代理绑定
func makeCoordinator() -> MyTextField.Coordinator {
Coordinator(parent: self)
}
class Coordinator: NSObject, NSTextFieldDelegate {
let parent: MyTextField
init(parent: MyTextField) {
self.parent = parent
}
func controlTextDidChange(_ obj: Notification) {
let textField = obj.object as! NSTextField
parent.text = textField.stringValue
}
}
加入contentView
struct ContentView: View {
@State var text = ""
var body: some View {
VStack {
Text("Custom TextField")
Group {
TextField("请输入文字", text: self.$text).padding()
MyTextField(text: self.$text).padding()
}
}.frame(width: 300, height: 400, alignment: .center)
}
}
END