我们正在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)