Как определить, какое текстовое поле активно быстро
Я не могу определить, какой UITextField
активен, поэтому я могу очистить его текст, если они UIBarButtonItem
на UIBarButtonItem
. Вот мой код. Существует представление с UIToolBar
UIPickerView
, UIToolBar
и двумя элементами панели. Элемент отмены имеет действие, которое очистит его текст, только я не могу понять, как получить правильный UITextField
.
Я пробовал оба:
@IBAction func cancelText(sender: AnyObject) {
if self.truckYear.editing == true{
println("truckYear")
clearText(self.truckYear)
} else if self.truckMake.editing == true{
clearText(self.truckMake)
}
}
@IBAction func doneText(sender: AnyObject) {
pickerView.hidden = true
}
func clearText(textField:UITextField){
println("in clear text")
textField.text = nil
}
А также:
@IBAction func cancelText(sender: AnyObject) {
if self.truckYear.isFirstResponder(){
println("truckYear")
clearText(self.truckYear)
} else if self.truckMake.isFirstResponder(){
clearText(self.truckMake)
}
}
@IBAction func doneText(sender: AnyObject) {
pickerView.hidden = true
}
func clearText(textField:UITextField){
println("in clear text")
textField.text = nil
}
Ответы
Ответ 1
Вы можете объявить свойство UITextField
в своем классе и присвоить ему текстовое поле в textFieldDidBeginEditing
. Затем вы можете просто называть это текстовое поле всякий раз, когда вам нужно.
class ViewController : UIViewController, UITextFieldDelegate {
var activeTextField = UITextField()
// Assign the newly active text field to your activeTextField variable
func textFieldDidBeginEditing(textField: UITextField) {
self.activeTextField = textField
}
// Call activeTextField whenever you need to
func anotherMethod() {
// self.activeTextField.text is an optional, we safely unwrap it here
if let activeTextFieldText = self.activeTextField.text {
print("Active text field text: \(activeTextFieldText)")
return;
}
print("Active text field is empty")
}
}
Ответ 2
В быстрой 4:
вы можете получить активный UITextField
extension UIView {
func getSelectedTextField() -> UITextField? {
let totalTextFields = getTextFieldsInView(view: self)
for textField in totalTextFields{
if textField.isFirstResponder{
return textField
}
}
return nil
}
func getTextFieldsInView(view: UIView) -> [UITextField] {
var totalTextFields = [UITextField]()
for subview in view.subviews as [UIView] {
if let textField = subview as? UITextField {
totalTextFields += [textField]
} else {
totalTextFields += getTextFieldsInView(view: subview)
}
}
return totalTextFields
}}
и тогда вы называете это так
let current = view.getSelectedTextField()
Ответ 3
Чтобы улучшить @Reimond ответ Swift 4
extension UIView {
var textFieldsInView: [UITextField] {
return subviews
.filter ({ !($0 is UITextField) })
.reduce (( subviews.compactMap { $0 as? UITextField }), { summ, current in
return summ + current.textFieldsInView
})
}
var selectedTextField: UITextField? {
return textFieldsInView.filter { $0.isFirstResponder }.first
}
}
Применение:
view.selectedTextField
Ответ 4
Используйте делегат:
optional func textFieldDidEndEditing(_ textField: UITextField)
Это скажет вам, когда активное текстовое поле завершает редактирование, а textField
будет содержать указатель на тот, который больше не будет активным.
Ответ 5
/// Finds the textField that is the first responder in a view hierarchy
func findActiveTextField(in subviews: [UIView], textField: inout UITextField?) {
guard textField == nil else { return }
for view in subviews {
if let tf = view as? UITextField, view.isFirstResponder {
textField = tf
break
}
else if !view.subviews.isEmpty {
findActiveTextField(in: view.subviews, textField: &textField)
}
}
}
// Usage
var aView: UIView = UIView()
var activeField : UITextField?
findActiveTextField(in: aView.subviews, textField: &activeField)
Ответ 6
Я написал библиотеку для обработки базовой формы Form Form Swift Pop Form. Он не использует tags
а скорее задает источник данных, который содержит поля, и использует indexPathForCell
для запроса, который является активным indexPathForCell
. Проверьте исходный код для получения дополнительной информации!