Ios 蓝牙条形码扫描仪在Swift4中向输入添加回车时提交UITextField

Ios 蓝牙条形码扫描仪在Swift4中向输入添加回车时提交UITextField,ios,swift,uitextfield,barcode,carriage-return,Ios,Swift,Uitextfield,Barcode,Carriage Return,我们正在Swift4中构建一个iOS应用程序,允许用户连接蓝牙条形码扫描仪(充当普通键盘),将数据扫描到UITextField中。我试图在扫描仪将回车添加到扫描数据的末尾时运行一个进程。该进程将数据发送到api端点,然后该端点将数据保存到相应的数据库 扫描UITextField可以很好地工作,但除非我们检查字符串长度并基于该长度提交,否则它不会提交。不幸的是,这是一种糟糕的处理方式,因为太少或太多的字符会导致后续扫描失败,给我留下一系列糟糕的数据 当前代码: @IBAction func tex

我们正在Swift4中构建一个iOS应用程序,允许用户连接蓝牙条形码扫描仪(充当普通键盘),将数据扫描到UITextField中。我试图在扫描仪将回车添加到扫描数据的末尾时运行一个进程。该进程将数据发送到api端点,然后该端点将数据保存到相应的数据库

扫描UITextField可以很好地工作,但除非我们检查字符串长度并基于该长度提交,否则它不会提交。不幸的是,这是一种糟糕的处理方式,因为太少或太多的字符会导致后续扫描失败,给我留下一系列糟糕的数据

当前代码:

@IBAction func textFieldEditingChanged(_ sender: UITextField) {
    if(sender.text!.count >= 12){
        if(sender.text!.count == 12){
            textView.text = textView.text + "\n" + sender.text!

            let  token = (SessionManager.shared.credentials?.accessToken)
            let email = SessionManager.shared.profile?.email ?? "none"
            let bearerString = "Bearer " + token!
            let headers = [
                BEARER TOKEN INFO
            ]
            let date = Date()
            let ERecord = ARecord(scannedId: sender.text!, scanDateTime: dateFormatter.string(from: date), deviceId: UIDevice.current.identifierForVendor!.uuidString, scannerUser: userCurrent.userID)

            eventAttendanceRecord.append(eventRecord)

            let parameters = [
                "scannedId": sender.text!,
                "scanDateTime": dateFormatter.string(from: date),
                "deviceId": UIDevice.current.identifierForVendor!.uuidString,
                "scannerUser": userCurrent.userID
                ] as [String : Any]

            let postData =  try? JSONSerialization.data(withJSONObject: parameters, options: [])

            let baseUrl = API ENDPOINT

            let request = NSMutableURLRequest(url: NSURL(string: baseUrl)! as URL,
                                              cachePolicy: .useProtocolCachePolicy,
                                              timeoutInterval: 10.0)
            request.httpMethod = "POST"
            request.allHTTPHeaderFields = headers
            do{
                let encodedData = try JSONEncoder().encode(eventRecord)
                request.httpBody = encodedData
            }
            catch{
                print("error happened here")
            }


            let session = URLSession.shared
            let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
                if (error != nil) {
                    print(error)
                } else {
                    let httpResponse = response as? HTTPURLResponse
                    print(httpResponse)
                }
            })

            dataTask.resume()

            DispatchQueue.main.async {
                self.makeFile()
            }
        }
        sender.text = ""
        sender.text?.removeAll()
    }
}
我试图在处理后清除文本字段,但如果扫描了一个简短的ID号,它将不会提交,因为它少于12个字符。但是,下一次扫描将添加其数据,表单将提前提交(扫描1+第二次扫描的前X位)。我尝试补充:

        sender.text = ""
        sender.text?.removeAll()

…但由于键盘(在本例中为蓝牙手持扫描仪)继续键入其扫描中的最后几个字符,因此UITextField留下了几个数字,错误的数字继续出现。

我想您应该看看UITextField的其他一些委托方法。下面是我为另一个应用程序编写的一些代码。看看这些是否有用。我认为,诀窍是在检测到返回时结束编辑模式,使用如下调用:
searchTextField.endEditing(true)


我想您应该看看UITextField的其他一些委托方法。下面是我为另一个应用程序编写的一些代码。看看这些是否有用。我认为,诀窍是在检测到返回时结束编辑模式,使用如下调用:
searchTextField.endEditing(true)

extension WeatherViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(true)
        print(searchTextField.text!)
        return true
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        // use searchTextField.text to get the weather, then...
        if let city = searchTextField.text {
            weatherManager.fetchWeather(cityName: city)
        }
        searchTextField.text = ""
    }

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        if textField.text != "" {
            return true
        } else {
            textField.placeholder = "Enter a city"
            return false
        }
    }
}