Если UITextField пуст, UIAlert не появляется

У меня есть приложение с 4 UITextFields, и я хочу отобразить UIAlert, если поле UIText пусто. У меня есть функция, которую я выбрал для отображения UIAlert, которая введите описание изображения здесь выглядит следующим образом:

func displayMyAlertMessage(userMessage: String) {
    let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertController.Style.alert)
    let okAction = UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)
    myAlert.addAction(okAction)
    self.present(myAlert, animated: true, completion: nil)
}

Я просмотрел этот пример и мог не заставить его работать, так как у меня есть UIPickerView для отображения текста. Ниже приведен код для didSelectRow:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if TrackTextField.isFirstResponder {
        selectedTrack = tracks[row]
        guard let track = selectedTrack?.isEmpty else {
            displayMyAlertMessage(userMessage: "You have to fill in a track")
            return
        }
        TrackTextField.text = String(track)
    } else if firstTextField.isFirstResponder {
        firstDriver = drivers[row]
        firstTextField.text = firstDriver
    } else if secondTextField.isFirstResponder {
        secondDriver = drivers[row]
        secondTextField.text = secondDriver
    } else if thirdTextField.isFirstResponder {
        thirdDriver = drivers[row]
        thirdTextField.text = thirdDriver
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController
        self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!))
        vc.grandPrix = self.grandPrix


    }
}

Я использовал TrackTextField, чтобы проверить, работает ли предупреждение. Как это бывает, когда я нажимаю на Grandprix Predictor, UIAlert не появляется. Ниже приведена функция, которая переходит к следующему UIViewController.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController
        self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!))
        vc.grandPrix = self.grandPrix


    }

Любая помощь будет оценена по достоинству.


person AltBrian    schedule 01.05.2019    source источник


Ответы (1)


Ваша проверка не должна выполняться в делегате представления выбора.

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

Добавьте метод verifyInput. Что-то типа:

func verifyInput() -> Bool {
    if TrackTextField.text?.isEmpty || firstTextField.text?.isEmpty || secondTextField.text?.isEmpty || thirdTextField.text?.isEmpty {
        // at least one is empty, show your alert here
        return false
    } else {
        return true // all good
    }
}

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

Пример:

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    // Only validate for this specific segue
    if identifier == "getPredictor" {
        return verifyInput()
    } else {
        return true
    }
}

Настройте логику по мере необходимости.

person rmaddy    schedule 01.05.2019
comment
Я немного запутался с битом validateInput. Не уверен, как бы я использовал функцию verifyInput при подготовке (для перехода: UIStoryboardSegue, отправитель: Any?)? - person AltBrian; 01.05.2019
comment
Вы не используете его в prepare. Слишком поздно. Вот почему я показал вам наглядный пример использования shouldPerformSegue. - person rmaddy; 01.05.2019