Я использую UIAlertController для запроса пользователя ввести строку, и эта строка не должна быть пустой. Для этого я добавляю обработчик для каждого события редактирования в UITextField, расположенном на UIAlertController. Этот обработчик проверяет, если текстовый фильтр пуст, он отключает кнопку «ОК» (находится на UIAlertController), и если текстовый фильтр не пуст, он активирует кнопку «ОК». Кнопка «OK» также расположена на UIAlertController. У меня есть проблемы с доступом к кнопке «OK» от этой функции обработчика:Как получить доступ к кнопке, размещенной на UIAlertController, из обработчика UITextField, размещенного на UIAlertController?
- Там нет возможности передать кнопку в качестве параметра непосредственно к функции обработчика, потому что я звоню его с помощью #selector ,
- Я также пытался получить доступ к UIAlertController через UITextField.superview из функции обработчика, но это не сработало: он вернул UIView, который не может быть отключен до UIAlertController. И непонятно, почему это так: UITextField является подпрограммой UIAlertController, и поэтому UITextField.superview должен возвращать UIAlertController.
- Я также пробовал самый простой способ: объявить UIAlertController как свойство в моем классе ViewController: это позволяет мне получить доступ к кнопке из функции обработчика, не передавая ее непосредственно функции. Но в этом случае я столкнулся с другой проблемой: во время выполнения Xcode показывает это предупреждение в области отладки: попытка загрузить представление контроллера представления при его освобождении не допускается и может привести к неопределенному поведению()
И мой вопрос: как получить доступ к кнопке «ОК» из моей функции обработчика?
class TVC_ProgramsList: UITableViewController {
var enterNameAC = UIAlertController()
@IBAction func addpush(sender: UIBarButtonItem) {
addProgram()
}
func addProgram() {
enterNameAC = UIAlertController(title: "Adding program", message: "Enter program name", preferredStyle: UIAlertControllerStyle.Alert)
enterNameAC.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
enterNameAC.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
enterNameAC.addTextFieldWithConfigurationHandler { (textField) -> Void in
textField.placeholder = "Program name"
textField.addTarget(self, action: #selector(TVC_ProgramsList.enterProgramNameAC_editingTextField), forControlEvents: UIControlEvents.AllEditingEvents)
}
self.presentViewController(enterNameAC, animated: true, completion: nil)
}
func enterProgramNameAC_editingTextField() {
let programNameString = enterNameAC.textFields![0].text!
if programNameString.characters.count > 0 {
enterNameAC.actions[1].enabled = true
} else {
enterNameAC.actions[1].enabled = false
}
}
}
Я новичок в Swift и Xcode, и, прежде чем задавать свой вопрос, я подумал, что это грубый способ объявить как класс attrubute UIAlertController или его subviews, и я подумал, что этот способ не соответствует рекомендациям Apple или что-то вроде этого :) Но теперь, когда вы сказали, что это правильный путь, я спокоен. –
Совершенно нормально иметь несколько атрибутов в классе. Как только объект требуется более чем в одной функции, вы должны начать думать о создании атрибутов, а не просто передавать объекты вокруг как параметры. – ezcoding