Как определить, какое текстовое поле активно быстро

Я не могу определить, какой 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. Проверьте исходный код для получения дополнительной информации!