Мы создаем приложение для iOS в Swift4, которое позволяет пользователю подключить сканер штрих-кода Bluetooth (действует как обычная клавиатура), чтобы сканировать данные в 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()
}
}
Я попытался очистить текстовое поле после обработки, но если, например, сканируется короткий идентификационный номер, он не будет отправлен, так как в нем меньше 12 символов,Однако при следующем сканировании будут добавлены его данные, и форма будет отправлена преждевременно (сканирование 1 + первые X цифр второго сканирования). Я попытался добавить:
sender.text = ""
sender.text?.removeAll()
... но поскольку клавиатура, в данном случае ручной сканер bluetooth, продолжает печатать последний из немногих символов после сканирования, то UITextField остается с паройцифр и плохих номеров продолжаются.