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