86
Пользовательский ввод
class SomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
textField = UITextField(frame: ...)
textField.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: .editingChanged)
}
@objc func textFieldDidChange(_ textField: UITextField) {
print(textField.text)
}
}
В этом примере в контроллере представления
SomeViewController
мы опреде
-
лили поле
UIText
с именем
textField
, которое добавляет целевое действие
text
FieldDidChange(_:)
для события
.editingChanged
. Всякий раз, когда пользователь
будет изменять текст в этом поле, для каждого добавляемого или изменяемого
символа будет вызываться метод
textFieldDidChange(_:)
; в нашем примере мы
просто выводим содержимое текстового
поля вызовом
print(textField.text)
.
Этот способ нормально работает, пока содержимое текстового поля не из
-
меняется программно. После этого наш метод
textFieldDidChange(_:)
замолкает,
и текст изменяется без уведомления.
Более надежный способ обнаружения изменений в текстовом поле дает до
-
бавление наблюдателя, как показано ниже:
class SomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
textField = UITextField(frame: ...)
NotificationCenter.default
.addObserver(self, selector: #selector(textFieldDidChange(_:)),
name: UITextField.textDidChangeNotification,
object: textField)
}
@objc func textFieldDidChange(_ notification: Notification) {
let textField = notification.object as! UITextField
print(textField.text)
}
}
Этот пример напоминает предыдущий, но имеет несколько важных отличий.
Прежде всего после создания экземпляра
UITextField
мы не устанавливаем об
-
работчик события
.editingChanged
, а организуем прослушивание уведомления
UITextField.textDidChangeNotification
.
Теперь наш метод
textFieldDidChange(_:)
будет вызываться всякий раз, когда поступит соответствующее уведомление;
однако, чтобы прочитать текст в следующей строке
print(textField.text)
, мы
приводим
notification.object
к типу
UITextField
.
До сих пор мы работали только с
UITextField
. А как быть, если понадобит
-
ся следить за несколькими текстовыми полями ввода и сочетанием объектов
UIText Field
и
UITextView
? Ваш код быстро может
превратиться в нечто вроде
этого :
iOS
87
class SomeViewController: UIViewController {
var textField1: UITextField!
var textField2: UITextField!
var textField3: UITextField!
var textView1: UITextView!
var textView2: UITextView!
var textView3: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default
.addObserver(self, selector: #selector(textFieldDidChange(_:)),
name: UITextField.textDidChangeNotification,
object: nil)
NotificationCenter.default
.addObserver(self, selector: #selector(textViewDidChange(_:)),
name: UITextView.textDidChangeNotification,
object: nil)
}
@objc func textFieldDidChange(_ notification: Notification) {
let textField = notification.object as! UITextField
doSomething(textField.text!)
}
@objc func textViewDidChange(_ notification: Notification) {
let textView = notification.object as! UITextView
doSomething(textView.text!)
}
private func doSomething(for text: String?) {
print(text)
}
}
Как сложно!
Но давайте оставим эти меланхоличные мысли и сосредоточимся на чем-то
другом. Вернемся снова к сенсорному вводу и обсудим более сложные средства
распознавания жестов. Эта сфера принадлежит UIKit и прекрасно масштаби
-
руется от простой до весьма сложной логики, не требуя особых трудозатрат от
разработчика.
Do'stlaringiz bilan baham: