2015-06-18 11 views
14

Non riesco a capire quale UITextField è attualmente attivo in modo da poter cancellare il suo testo se si preme Annulla su un UIBarButtonItem. Ecco il mio codice. C'è una vista con uno UIPickerView, UIToolBar e due elementi del pulsante bar. L'elemento di annullamento ha un'azione che cancellerà il suo testo solo non riesco a capire come ottenere il corretto UITextField.Come determinare quale campo di testo è attivo swift

ho provato questi sia:

@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 
} 

E:

@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 
} 

risposta

27

È possibile dichiarare una proprietà UITextField nella classe e assegnarvi il campo di testo corrente in textFieldDidBeginEditing. Quindi puoi chiamare questo campo di testo ogni volta che è necessario.

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") 
    } 
} 
+0

Quindi potrei usarlo e poi nell'azione UIBarButtonItem basta dire clearText (self.activeTextField)? – Suzukijak3

+0

Sì, saresti in grado di farlo. – Randy

+0

Ok ho appena provato e nessun errore, ma il testo non è stato impostato per nill. Questo è il mio codice, 'textFieldDidBeginEditing func (textField: UITextField) { self.activeTextfield = textField } @IBAction func cancelText (mittente: ANYOBJECT) { println ("azione licenziato") self.activeTextfield. text = nil self.pickerView.hidden = true} @IBAction func doneText (mittente: ANYOBJECT) { pickerView.hidden = true} ' – Suzukijak3

0

Usa il delegato:

optional func textFieldDidEndEditing(_ textField: UITextField) 

questo vi dirà quando il campo di testo attiva termina l'editing, e textField conterrà un puntatore a quello che non sarà più attivo.

+0

Mi può dare un esempio di come implementarlo in quell'azione? – Suzukijak3

+1

Consiglio vivamente di imparare come implementare i metodi delegati. Se non lo hai capito, non avrai problemi con l'API Cocoa. – Almo

+0

Attuo alcuni metodi delegati ma sono abbastanza nuovo da essere veloce, quindi non ho tutti i pezzi del puzzle, ma ci provo. – Suzukijak3

0
/// 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) 
+0

'Uso dell'identificatore non risolto 'campo attivo', correggere questo –

1

a Swift 4:

è possibile ottenere l'UITextField attiva come quella

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 
}} 

e quindi si chiama in quel modo

let current = view.getSelectedTextField() 
Problemi correlati