繁体   English   中英

SwiftUI TextField onChange 未触发

[英]SwiftUI TextField onChange not triggered

SwiftUI 的新手并试图弄清楚一些事情。 我正在实现一个条形码扫描仪,它由一个TextFieldButtonCameraView 组成 CameraView将扫描条形码,在TextField 中显示序列号, Button将使用序列号与蓝牙设备配对。

所以现在在我的 SwiftUI 类中,我的 UI 设置如下:

struct BTLEConnectionView: View {
    @ObservedObject var bluetoothConnectorViewModel: BluetoothConnectorViewModel
    @ObservedObject var barcodeScannerViewModel = BarcodeScannerViewModel()
    @Binding var deviceID: String

    @State private var serialNumber: String = ""

    var body: some View {
        VStack {
           HStack {
               DeviceIDTextField(deviceID: $deviceID, serialNumber: $serialNumber, viewModel: barcodeScannerViewModel)
            
               PairButton(bluetoothConnectorViewModel: bluetoothConnectorViewModel, barcodeScannerViewModel: barcodeScannerViewModel, serialNumber: $serialNumber)
           }
           .padding()
    
           BarcodeScannerView(barscannerViewModel: barcodeScannerViewModel)
       }
   }
}

struct DeviceIDTextField: View {
   @Binding var deviceID: String
   @Binding var serialNumber: String
   @ObservedObject var viewModel: BarcodeScannerViewModel

   var body: some View {
       let serialNumberBinding = Binding<String>(
           get: { viewModel.barcodeString.isEmpty ? serialNumber : viewModel.barcodeString },
           set: { serialNumber = viewModel.barcodeString.isEmpty ? $0 : viewModel.barcodeString }
       )
    
       TextField(NSLocalizedString("textfield.hint.device.id", comment: ""), text: serialNumberBinding)
           .textFieldStyle(RoundedBorderTextFieldStyle())
           .onChange(of: serialNumber, perform: { value in
               serialNumber = value
           })
   }

   private func textFieldChanged(_ text: String) {
       print(text)
   }
}

struct PairButton: View {
   @ObservedObject var bluetoothConnectorViewModel: BluetoothConnectorViewModel
   @ObservedObject var barcodeScannerViewModel: BarcodeScannerViewModel
   @Binding var serialNumber: String

   var body: some View {
       Button(action: {
           withAnimation {
               bluetoothConnectorViewModel.connectBluetoothLowEnergyDevice(deviceID: serialNumber)
           }
       }) {
           ButtonText(text: NSLocalizedString("button.text.pair", comment: ""))
       }
   }
}

所以基本上我想这样做:如果用户扫描条形码,序列将被添加到文本字段中,按下配对按钮以使用该序列并调用该方法并传入序列号。 如果用户删除预填充的序列号,输入自己的序列号,则应更新文本字段,按下按钮应使用新的序列号。

现在,当我扫描条形码时,它会填充文本字段,但是在我实际输入 TextField 之前不会拾取 onChange 回调,因此永远不会为方法调用设置结果。

对此的任何帮助都会很棒,希望它有意义。

您可以使用自定义闭包创建绑定,如下所示:

struct ContentView: View {
    @State var location: String = ""

    var body: some View {
        let binding = Binding<String>(get: {
            self.location
        }, set: {
            self.location = $0
            // do whatever you want here
        })

        return VStack {
            Text("Current location: \(location)")
            TextField("Search Location", text: binding)
        }

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM