首页 > 解决方案 > 当蓝牙条码扫描仪在Swift4中添加回车符时提交UITextField

问题描述

我们正在用 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 留下了几个数字,并且错误的数字继续存在。

标签: iosswiftuitextfieldbarcodecarriage-return

解决方案


我想你想看看 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
        }
    }
}

推荐阅读