簡體   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