2015-06-18 18 views
14

Nie mogę określić, które UITextField jest obecnie aktywne, więc mogę wyczyścić jego tekst, jeśli zostanie on anulowany na UIBarButtonItem. Oto mój kod. Istnieje widok z elementami UIPickerView, UIToolBar i dwoma przyciskami paska. Pozycja anulowania ma działanie, które wyczyści jej tekst i nie będę w stanie uzyskać prawidłowej wersji UITextField.Jak określić, które pole tekstowe jest aktywne?

Próbowałem to zarówno:

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

I:

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

Odpowiedz

27

Możesz zadeklarować właściwość UITextField w swojej klasie i przypisać do niej bieżące pole tekstowe w textFieldDidBeginEditing. Następnie możesz po prostu wywołać to pole tekstowe, kiedy tylko zajdzie taka potrzeba.

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

Więc czy mogę użyć tego, a następnie w akcji UIBarButtonItem po prostu powiedz clearText (self.activeTextField)? – Suzukijak3

+0

Tak, byłbyś w stanie to zrobić. – Randy

+0

Ok Po prostu próbowałem i nie ma błędów, ale tekst nie jest ustawiony na zero. To jest mój kod, 'func textFieldDidBeginEditing (textField: UITextField) { self.activeTextfield = textField } @IBAction func cancelText (nadawca: AnyObject) { println ("akcja zwolniony") self.activeTextfield. text = nil self.pickerView.hidden = true } @IBAction func doneText (Sender: AnyObject) { pickerView.hidden = true } '' – Suzukijak3

0

Użyj delegat:

optional func textFieldDidEndEditing(_ textField: UITextField) 

To powie Ci, kiedy aktywny textfield kończy edycję, a textField będzie zawierał wskaźnik do tego, który nie będzie już aktywny.

+0

możesz mi dać przykład jak zaimplementować to w tym działaniu? – Suzukijak3

+1

Naprawdę polecam naukę wdrażania metod delegowanych. Nie będziesz miał problemów z interfejsem API Cocoa, jeśli tego nie wiesz. – Almo

+0

Wdrażam niektóre metody delegatów, ale jestem dość nowy na szybkie, więc nie mam wszystkich elementów do układanki, ale zrobię na nią strzał. – 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

"Użyj nierozwiązanego identyfikatora" activeField'' proszę to naprawić –

1

w Swift 4:

można uzyskać aktywnego UITextField jak ten

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

a potem nazywają to tak

let current = view.getSelectedTextField()