ios - 当蓝牙条码扫描仪在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 留下了几个数字,并且错误的数字继续存在。
解决方案
我想你想看看 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
}
}
}
推荐阅读
- node.js - 得到
使用 selenium Webdriver 的内容
- c# - EF Core 多对多键重复
- java - 如何使用 Spring MVC 将 bean 的返回值传递给其他
- ios - Swift 集成的 XWebView 项目现在要创建 iPA 文件
- javascript - 使用 Chart.js 绘图
- python - 使用 Selenium Webdriver,抓取未显示在 innerhtml 中的数据
- python - 将带有嵌套对象的 JSON 转换为 Pandas 数据框
- https - 如何在谷歌云中打开 HTTPS 端口?
- linux - 我不能将 GLFW 放入 CodeBlocks
- python-3.x - 每 n 秒使用 Open CV 处理一张图像