[英]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.