Comment déterminer quel champ Text est actif swift
je ne peux pas comprendre ce qui UITextField
est actuellement actif donc je peux effacer son texte s'ils frappent cancel sur un UIBarButtonItem
. Voici mon code. Il y a une vue avec un UIPickerView
,UIToolBar
et deux boutons-poussoirs. L'élément d'annulation a une action qui va effacer son texte seulement je ne peux pas comprendre comment obtenir le correct UITextField
.
j'ai essayé ces deux:
@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
}
Et:
@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
}
6 réponses
Vous pouvez déclarer un UITextField
propriété dans votre classe, et d'attribuer l'actuel champ de texte textFieldDidBeginEditing
.
Alors vous pouvez simplement appeler ce champ de texte quand vous en avez besoin.
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's text: \(activeTextFieldText)")
return;
}
print("Active text field is empty")
}
}
dans swift 4:
vous pouvez obtenir de l'actif UITextField comme ça
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
}}
et puis vous l'appeler comme ça
let current = view.getSelectedTextField()
afin d'améliorer la réponse de @Reimond Swift 4
extension UIView {
var textFieldsInView: [UITextField] {
return subviews
.filter ({ !( is UITextField) })
.reduce (( subviews.compactMap { as? UITextField }), { summ, current in
return summ + current.textFieldsInView
})
}
var selectedTextField: UITextField? {
return textFieldsInView.filter { .isFirstResponder }.first
}
}
utilisation:
view.selectedTextField
Utiliser le délégué:
optional func textFieldDidEndEditing(_ textField: UITextField)
cela vous indiquera quand le textfield actif termine l'édition, et textField
contient un pointeur vers celui qui ne va plus être actif.
/// 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)
j'ai écrit une bibliothèque pour gérer la Création de Forme Formulaire Swift Pop.
Il n'utilise pas tags
mais définit plutôt une source de données qui contient des champs et utilise indexPathForCell
à la demande, et qui est le principe actif de textfield. Consultez le code source pour en savoir plus!