2017-01-04 1 views
0

genannt Ich habe eine einfache UITableViewController mit 6 Zeilen, jeweils mit einem UITextField. Ich möchte in der Lage sein, auf jede Zeile zu klicken und die Tastatur auf jede Zeile anwenden zu lassen. Alles funktioniert, außer aus irgendeinem Grund muss ich zweimal auf jede Reihe klicken, um den Responder dazu zu bringen, die nächste UITextField aktiv zu machen. Ich legte UITextFieldDelegate Ausdrucke und die Reihenfolge ihrer Aktionen scheint falsch. Jeder der TextFields wurde mit 0 - 5 markiert. Wenn ich den ersten auswähle, gibt es kein Problem, die Tastatur kommt hoch, ich gebe etwas ein. Mein Ausdruck ist:textFieldSouldBeginEditing aufgerufen, textFieldDidBeginEditing nicht

textFieldShouldBeginEditing tag: 0 textFieldDidBeginEditing tag: 0

Dann wähle ich die nächste Zeile (ohne in der Tastatur auf Fertig hitting) und der Ausdruck ist dies:

textFieldShouldBeginEditing tag: 1 textFieldShouldEndEditing tag: 0 textFieldDidEndEditing tag: 0

Warum ist textFieldDidBeginEditing nicht genannt zu werden?

Hier ist mein Code, falls es hilft:

class EstimateCell: UITableViewCell, UITextFieldDelegate { 


    @IBOutlet weak var estimateField: UITextField! 

    // callback to alert when user clicked "Done" 
    var doneTextFieldInput: ((cell: EstimateCell, newText:String?) -> Void)? 


    override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 

    // self.selectionStyle = .None 

    estimateField.delegate = self 
    estimateField.clearsOnBeginEditing = true 

    // add a done button to the numberpad 
    addDoneButtonOnNumpad(estimateField) 

    // add some padding to the right margin 
    estimateField.layer.sublayerTransform = CATransform3DMakeTranslation(-20, 0, 0) 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
    } 

    /** 
    Only allow 4 digits 
    */ 
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 

    // only allow 4 digits max 
    guard let text = textField.text else { return true } 
    let newLength = text.characters.count + string.characters.count - range.length 
    let isMax4digits = newLength <= 5 
    return isMax4digits 
    } 

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool { 
    print("textFieldShouldBeginEditing \(textField.tag)") 

    return true 
    } 
    func textFieldDidBeginEditing(textField: UITextField) { 
    textField.text = "" 
    print("textFieldDidBeginEditing \(textField.tag)") 
    } 

    func textFieldShouldEndEditing(textField: UITextField) -> Bool { 
    print("textFieldShouldEndEditing \(textField.tag)") 
    return true 
    } 

    /** 
    Called after the textfield resigns as the first responder 
    */ 
    func textFieldDidEndEditing(textField: UITextField) { 
    print("textFieldDidEndEditing \(textField.tag)") 
    doneTextFieldInput?(cell: self, newText: textField.text) 
    // textField.resignFirstResponder() 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
    print("textFieldShouldReturn") 
    textField.resignFirstResponder() 
    return true 
    } 
    /** 
    Adds a toolbar with a Done button as an input accessory view to the given textfield. Calls 
    resignFirstResponder when Done is clicked. 
    */ 
    func addDoneButtonOnNumpad(textField: UITextField) 
    { 
    let keypadToolbar: UIToolbar = UIToolbar() 

    // add a done button to the numberpad 
    keypadToolbar.items=[ 
     UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder)), 
     UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil) 
    ] 
    keypadToolbar.sizeToFit() 
    // add a toolbar with a done button above the number pad 
    textField.inputAccessoryView = keypadToolbar 
    } 
} 
+0

versuchen Sie mit dem Entfernen von Code aus watchFromNib() Methode estimateField.clearsOnBeginEditing = true – Harish

+0

Leider hat das nicht getan. Danke für den Versuch! Mein einziger anderer Gedanke ist eine Änderung an einem UIViewController und ein UITableView hinein und versuchen Sie es so. Der Grund, warum ich das nicht getan habe, ist, die automatische Bildlauffunktion zu bekommen, wenn eines der unteren Textfelder ausgewählt wird. – Coder1224

+0

Danke für die schnelle Überprüfung und viel Glück @ Coder1224 – Harish

Antwort

3

ich es herausgefunden. Das Problem ist, ich rief tableView.reloadData() in meinem Rückruf innerhalb textFieldDidEndEditing(). Dies führte dazu, dass der Code, der meine textfield.delegate = self setzt, erneut ausgelöst wurde, was getan wurde, bevor textFieldShouldBeginEditing() aufgerufen werden konnte. Hoffentlich hilft das einem anderen da draußen eines Tages: Laden Sie Ihre Tischansicht nicht von innen neu textFieldDidEndEditing().

Verwandte Themen