当蓝牙条形码扫描仪将回车添加到Swift4中的输入时提交UITextField

问题描述 投票:1回答:1

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

ios swift uitextfield barcode carriage-return
1个回答
0
投票

我认为您希望查看UITextField的其他一些委托方法。这是我为另一个应用程序编写的一些代码。看看是否有任何帮助。我认为,这种技巧将在您使用以下调用检测到返回值时结束编辑模式:searchTextField.endEditing(true)

© www.soinside.com 2019 - 2024. All rights reserved.