You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI TextField onChange未触发,条码扫描填充文本后回调无响应如何解决

问题根因

你当前的逻辑存在两处核心问题:

  1. 扫描条码后仅更新了BarcodeScannerViewModel的barcodeString属性,从未同步赋值给serialNumber状态变量,因此监听serialNumber的onChange不会触发,配对按钮读取的serialNumber也一直是旧值。
  2. 你自定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:39:00