SwiftUI TextField onChange未触发,条码扫描填充文本后回调无响应如何解决
问题根因
你当前的逻辑存在两处核心问题:
- 扫描条码后仅更新了
BarcodeScannerViewModel的barcodeString属性,从未同步赋值给serialNumber状态变量,因此监听serialNumber的onChange不会触发,配对按钮读取的serialNumber也一直是旧值。 - 你自定义的
serialNumberBinding逻辑冗余且存在缺陷:如果已经扫描过条码、barcodeString不为空,即使用户手动输入新内容,setter也不会把新值写入serialNumber,会导致手动输入失效。
修复方案
直接删掉冗余的自定义Binding,新增对barcodeString的监听,扫描到新值时自动同步给serialNumber即可,修改后的DeviceIDTextField代码如下:
struct DeviceIDTextField: View { @Binding var deviceID: String @Binding var serialNumber: String @ObservedObject var viewModel: BarcodeScannerViewModel var body: some View { TextField(NSLocalizedString("textfield.hint.device.id", comment: ""), text: $serialNumber) .textFieldStyle(RoundedBorderTextFieldStyle()) // 监听扫描结果变化,自动同步到serialNumber .onChange(of: viewModel.barcodeString) { newValue in guard !newValue.isEmpty else { return } serialNumber = newValue } } }
验证效果
修改后即可同时满足你的两个需求:
- 扫描到条码时,
barcodeString变化触发onChange,自动把扫描值写入serialNumber,文本框会同步显示,配对按钮直接读取serialNumber即可拿到最新的扫描值 - 用户手动修改文本框内容时,会直接更新
serialNumber,配对时用的就是用户手动输入的新值
内容的提问来源于stack exchange,提问作者Ayohaych
相关产品推荐
相关产品推荐

