Swift 5 - проверка в текстовых полях через UIAlertView - PullRequest
0 голосов
/ 21 октября 2019

Итак, я использую Swift 5 и работаю с core data. Я пытаюсь добавить проверку к текстовым полям через UIAlertView.

Чтобы прояснить, что мой код уже делает:

  • Пользователь нажимает кнопку, после которой появляется всплывающий интерфейс библиотеки фотографий iOS.
  • После выбора фотографии *Появляется 1011 * и запрашивает два введенных текста в двух текстовых полях.
  • Как только это будет сделано, данные отправляются в базу данных и отображают изображение и тексты, которые я ввел на TableViewCell

Проблема?

При отправке пустого текстового поля нет запроса пользователю ввести текст. Он будет отображать изображение только в UITableViewCell без каких-либо текстов, что является очевидным результатом при вводе без строк.

Чего я хочу достичь?

Чтобы добавить пользователю сообщение проверки, когда он не вводит текст, и отменить процесс отправки в базу данных.

Что я уже пробовал?

Пожалуйста, смотрите ниже для кода. Примечание: отправка изображения и текстов в базу данных уже работает, моя проблема связана с проверкой текстового поля

func createBrandItem (with image:UIImage){
        let brandItem = Brand(context: managedObjectContext)
        brandItem.image = NSData(data: image.jpegData(compressionQuality: 0.3)!) as Data

        let inputAlert = UIAlertController(title: "New Brand", message: "Enter an item and a brand.", preferredStyle: .alert)
        inputAlert.addTextField { (textfield:UITextField) in
            textfield.placeholder = "Item"
        }
        inputAlert.addTextField { (textfield:UITextField) in
            textfield.placeholder = "Brand"
        }

        inputAlert.addAction(UIAlertAction(title: "Save", style: .default, handler: { (action:UIAlertAction) in

            let itemTextField = inputAlert.textFields?.first
            let productTextField = inputAlert.textFields?.last

            if (itemTextField?.text!.isEmpty)! || (productTextField?.text!.isEmpty)! {

                let alertBlankInput = UIAlertController(title: "Blank Input", message: "Please don't leave the textfields empty.", preferredStyle: .alert)

                let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel)

                alertBlankInput.addAction(okAction)

                self.present(alertBlankInput, animated: true, completion: nil)
            }

            if itemTextField?.text != "" && productTextField?.text != "" {
                        brandItem.item = itemTextField?.text
                        brandItem.brand = productTextField?.text

                        do{
                            try self.managedObjectContext.save()
                            self.loadData()
                        }
                        catch{
                            print("Could not save data \(error.localizedDescription)")
                        }
                    }
                }))

                inputAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

                if self.presentedViewController == nil {
                    self.present(inputAlert, animated: true, completion: nil)
                }
                else {
                    self.dismiss(animated: false, completion: nil)
                    self.present(inputAlert, animated: true, completion: nil)
                }
            }

Разбивка кода

Фрагмент нижеэто то, что я пытался добавить к функции createBrandItem. Когда я добавляю этот оператор if при отладке приложения, он использует этот условный оператор, но также завершает условный оператор, добавляя его в базу данных.

if (itemTextField?.text!.isEmpty)! || (productTextField?.text!.isEmpty)! {

            let alertBlankInput = UIAlertController(title: "Blank Input", message: "Please don't leave the textfields empty.", preferredStyle: .alert)

            let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel)

            alertBlankInput.addAction(okAction)

            self.present(alertBlankInput, animated: true, completion: nil)
        }

Приведенный ниже код является фрагментом, который добавляет данныев базу данных.

let brandItem = Brand(context: managedObjectContext)
        brandItem.image = NSData(data: image.jpegData(compressionQuality: 0.3)!) as Data

if itemTextField?.text != "" && productTextField?.text != "" {
                    brandItem.item = itemTextField?.text
                    brandItem.brand = productTextField?.text

                    do{
                        try self.managedObjectContext.save()
                        self.loadData()
                    }
                    catch{
                        print("Could not save data \(error.localizedDescription)")
                    }
                }

Сводка

Как мне поступить, если текстовые поля пусты и останавливает процесс отправки в базу данных

1 Ответ

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

Я бы порекомендовал создать свой собственный дочерний контроллер представления, который вы представляете в виде модельного диалога, который был бы более элегантным и дал бы вам гораздо больший контроль над процессом. Однако если вы хотите продолжить работу с контроллером оповещений, вы можете заставить его работать, создав действие OK в отключенном состоянии:

let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel)
okActions.isEnabled = false
inputAlert.addAction(okAction)

, а затем использовать делегаты textFields для проверки содержимого текстовых полей (вам нужно иметь средства для координации между двумя текстовыми полями - вы можете использовать массив textfields? alertController для перекрестной проверки или использовать локальные переменные в качестве флагов) и когда вы довольны содержимым обоих

inputAlert.actions.filter({$0.title == "OK"  }).first?.isEnabled = true
...