[英]SwiftUI TextField onChange not triggered
SwiftUI 的新手并试图弄清楚一些事情。 我正在实现一个条形码扫描仪,它由一个TextField 、 Button和CameraView 组成。 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.