Отправить UITextField, когда сканер штрих-кода Bluetooth добавляет возврат каретки на вход в Swift4 - PullRequest
1 голос
/ 25 октября 2019

Мы создаем приложение для 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 остается с паройцифр и плохих номеров продолжаются.

1 Ответ

0 голосов
/ 27 октября 2019

Я думаю, что вы хотите взглянуть на некоторые другие методы делегата для 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
        }
    }
}
...