Проверка пустого текста в нескольких текстовых полях внутри контроллера предупреждений - PullRequest
1 голос
/ 05 июня 2019

uialert controller

Это мой контроллер оповещений. Мне нужно отключить кнопку отправки, если любое из текстовых полей пусто. В настоящее время у меня есть метод проверки одного текстового поля, но я не могу понять, как применить его ко всем из них. Это мой контроллер предупреждений и текстовые поля:

  let ac = UIAlertController(title: "Enter Custom Specifications", message: nil, preferredStyle: .alert)
    ac.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = "Material Name"
        textField.addTarget(self, action: #selector(self.textFieldDidChange(textField:)), for: .editingChanged)
    }

    ac.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = ""
        textField.keyboardType = UIKeyboardType.decimalPad
    }

    ac.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = ""
        textField.keyboardType = UIKeyboardType.decimalPad
    }

    ac.addTextField { (textField : UITextField!) -> Void in
        textField.placeholder = ""
        textField.keyboardType = UIKeyboardType.decimalPad
    }

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

 @objc func textFieldDidChange(textField: UITextField){
    if textField.text == "" {

        submitAction.isEnabled = false
    }
    else
    {
        submitAction.isEnabled = true

    }

}

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

РЕДАКТИРОВАТЬ:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField.text == "" {
        //You can perfrom your activity here when textfield got blank or empty
        submitAction.isEnabled = false
    }
    else if textField.text != ""
    {
        submitAction.isEnabled = true
        //You can perfrom your activity here when textfield got not blank or not empty
    }
    //add your code here...
    return true
}

EDIT2:

func textField (_ textField: UITextField, shouldChangeCharactersIn диапазон: NSRange, замена String string: String) -> Bool {

    if let text = (textField.text as? NSString)?.replacingCharacters(in: range, with: string), !text.isEmpty {
        if let text = textField.text?.replacingCharacters(in: range, with: string), !text.isEmpty {
            submitAction.isEnabled = true
        } else {
            submitAction.isEnabled = false
        }
        return true
    }}

РЕДАКТИРОВАТЬ 3: Вместо того, чтобы все текстовые поля назывались просто «текстовое поле», я могу назвать их текстовым полем «x» при их создании:

ac.addTextField { (textField2 : UITextField!) -> Void in
        textField2.placeholder = "Column Width (in)"
        textField2.keyboardType = UIKeyboardType.decimalPad
        textField2.delegate = self
    }

Как я могу получитьChangeCharactersIn, чтобы принимать их всех одновременно?

РЕДАКТИРОВАТЬ (решение):

Хорошо, я понял это. PGDev был прав в логической части, но не в функции делегата, используемой для фактической проверки. Я собираюсь отметить его ответ правильно, так как я бы не добрался до этого без него.

Изначально мы использовали textFieldDidEndEditing, и я подумал, что он просто не работает, потому что он не сможет снова включить кнопку отправки после заполнения всех четырех текстовых полей. Чего я не понял, так это того, что мне нужно было нажать на дополнительное текстовое поле после того, как я закончил, для вызова textFieldDidEndEditing. Имеет смысл, так как в названии есть «EndEditing».

Я взял логику PGDevs и вставил ее в mustChangeCharactersIn, которая работала, но не идеально. Я не уверен, что есть внутренняя проблема с этим, но когда вы пытаетесь заполнить последнее текстовое поле, иногда backspace (или что-то) интерпретируется как символ и выбрасывает оператор enable /! Enable из дурака.

textFieldDidChange с использованием логики PGDevs был ответом.

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

var textField1: UITextField?
var textField2: UITextField?
var textField3: UITextField?
var textField4: UITextField?

Поместите эту функцию внизу вашей функции класса:

   @objc func textFieldDidChange(_ textField: UITextField) {

    let text1 = self.textField1?.text ?? ""
    let text2 = self.textField2?.text ?? ""
    let text3 = self.textField3?.text ?? ""
    let text4 = self.textField4?.text ?? ""

    if !text1.isEmpty && !text2.isEmpty && !text3.isEmpty && !text4.isEmpty {
        submitAction.isEnabled = true
    } else {
        submitAction.isEnabled = false
    }

}

Когда вы генерируете фактическое текстовое поле в контроллере оповещений, вызывайте вышеуказанную функцию:

 let ac = UIAlertController(title: "Enter Custom Specifications", message: nil, preferredStyle: .alert)
    ac.popoverPresentationController?.sourceView = self.view
    ac.addTextField { (textField : UITextField!) -> Void in
        textField.delegate = self
        textField.placeholder = "Material Name"
        self.textField1 = textField
        textField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
    }

Это прекрасно работает для меня. если во всех 4 строках есть хотя бы один символ, передача остается отключенной. Это можно использовать для любого количества текстовых полей.

1 Ответ

2 голосов
/ 05 июня 2019

Попробуйте установить делегат каждого textField в качестве viewCobtroller, в котором вы представляете предупреждение, т. Е.

textField.delegate = self

Соответствует ViewController протоколу UITextFieldDelegate,

class ViewController: UIViewController, UITextFieldDelegate {

Внедрить соответствующийUITextFieldDelegate методов, Пример:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let text = (textField.text as? NSString)?.replacingCharacters(in: range, with: string), !text.isEmpty {
        submitAction.isEnabled = true
    } else {
        submitAction.isEnabled = false
    }
    return true
}

Редактировать:

Вам нужно оставить reference для всех textFields, чтобы вы могли проверить text во всех из них на enable/disable submitAction, т.е.

var textField1: UITextField?
var textField2: UITextField?
var textField3: UITextField?
var textField4: UITextField?

Установите каждый из textFields при добавлении к UIAlertController, т.е.

let ac = UIAlertController(title: "Enter Custom Specifications", message: nil, preferredStyle: .alert)
ac.addTextField { (textField : UITextField!) -> Void in
    textField.delegate = self
    textField.placeholder = "Material Name"
    self.textField1 = textField
}
ac.addTextField { (textField : UITextField!) -> Void in
    textField.delegate = self
    textField.keyboardType = UIKeyboardType.decimalPad
    self.textField2 = textField
}
ac.addTextField { (textField : UITextField!) -> Void in
    textField.delegate = self
    textField.keyboardType = UIKeyboardType.decimalPad
    self.textField3 = textField
}
ac.addTextField { (textField : UITextField!) -> Void in
    textField.delegate = self
    textField.keyboardType = UIKeyboardType.decimalPad
    self.textField4 = textField
}

Звоните validate() каждый раз, когда происходит изменение любого из textFields, то есть

func textFieldDidEndEditing(_ textField: UITextField) {
    self.validate()
}


func validate() {
    let text1 = self.textField1?.text ?? ""
    let text2 = self.textField2?.text ?? ""
    let text3 = self.textField3?.text ?? ""
    let text4 = self.textField4?.text ?? ""

    if !text1.isEmpty && !text2.isEmpty && !text3.isEmpty && !text4.isEmpty {
        submitAction.isEnabled = true
    } else {
        submitAction.isEnabled = false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...