我需要在SwiftUI中使用UITextField,并且我可以使用绑定变量将UITextField中的文本更改发布到我的视图模型.

但我做不到opposite米.我希望能够在我在ViewModel中发布的变量发生更改时更新UITextfield.因为有时我希望能够用我从互联网上获取的数据自动填充文本字段.

struct Test: View {
    @StateObject private var vm = TestVM()
    var body: some View {
        UIKitField(text: $vm.text)
            .onAppear {
                vm.fetchData()
            }
    }
}

class TestVM: ObservableObject {
    @Published var text = ""

    func fetchData() {
        text = "abc" // here I want textfield's text to be updated.
    }
}

struct UIKitField: UIViewRepresentable {
    @Binding var text: String

    private let textField = UITextField()

    func makeUIView(context: Context) -> UITextField {
        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {}

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    final class Coordinator: NSObject {
        private let parent: UIKitField
        init(_ parent: UIKitField) {
            self.parent = parent
            super.init()
            self.parent.textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        }

        @objc func editingChanged() {
            parent.text = parent.textField.text!
        }
    }
}

推荐答案

updateUIView(_:context:)中更新textField's text.

From Apple Document:

当你的应用程序状态更改时,SwiftUI会更新受这些更改影响的界面部分.对于影响相应UIKit视图的任何更改,SwiftUI调用此方法.

func updateUIView(_ uiView: UITextField, context: Context) {
    guard uiView.text != text else { return } //Change only if it doesn't match
    uiView.text = text
}

Swift相关问答推荐

同步问题,发送Api Call之前未设置idToken

阻塞(受CPU限制的)任务的异步功能?

SwiftUI map 旋转

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

在按下按钮动画后执行按钮动作

仅当单击UIButton时才调用计时器函数

Swift通过设置变量B自动设置变量A的值

使用序列初始化字符串的时间复杂度是多少?

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

在Equatable上引用运算符函数==要求Dictionary.Values符合Equatable

在 RealmSwift 中表示范围值?

SwiftUI View Builder 参数无法更改状态

Swift - 如何更新多目录中的对象

单元测试和私有变量

'NSLog' 不可用:可变参数函数在 swift 中不可用

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)

强制打开已在同一行代码中 Select 性访问的变量是否安全?

Swift 中的可选数组与空数组

如何在 Swift 中判断变量的类型

Swift 中的 recursiveDescription 方法?