Ich habe UITableView
mit etwa 20 Zeilen, die jeweils eine UITextField
enthalten. Wenn ich zum ersten Mal in ein Textfeld klicke, wird die Tastatur geöffnet und ich kann dieses Textfeld bearbeiten. Wenn ich auf das nächste Textfeld klicke (die Tastatur wird ständig angezeigt), wird die Tastatur zwar weiterhin angezeigt, aber der blaue Cursor befindet sich nicht im neuen Textfeld und ich kann keinen Text eingeben. Aber wenn ich wieder auf ein anderes Textfeld tippe, funktioniert es gut. Dieses Verhalten tritt abwechselnd auf, einmal funktioniert es das andere Mal nicht.UITextField in UITableView wird nicht zum Ersthelfer
Die Delegate-Methode textFieldShouldBeginEditing(_:)
wird immer aufgerufen, ob ich sie bearbeiten kann oder nicht. Die Delegate-Methode textFieldDidBeginEditing(_:)
wird nur beim Bearbeiten aufgerufen.
Dies ist der Code für cellForRowAt
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldCell")!
let titleLabel = cell.viewWithTag(1) as! UILabel
let contentTextField = cell.viewWithTag(2) as! FixableTextField
contentTextField.delegate = self
contentTextField.inputAccessoryView = doneToolbar
// Enable/disable editing for text fields
if isEditing {
contentTextField.enableEditing()
} else {
contentTextField.disableEditing()
}
// Present Profile Data
if profileUpdateBuffer != nil {
switch indexPath.row {
case 0:
titleLabel.text = "Count"
contentTextField.text = "\(profileUpdateBuffer!.count)"
contentTextField.purposeID = "count"
contentTextField.keyboardType = .numberPad
case 1:
titleLabel.text = "City"
contentTextField.text = "\(profileUpdateBuffer!.city)"
contentTextField.purposeID = "city"
contentTextField.keyboardType = .default
// ...
case 20:
titleLabel.text = "Name"
contentTextField.text = "\(profileUpdateBuffer!.name)"
contentTextField.purposeID = "name"
contentTextField.keyboardType = .default
default:
titleLabel.text = ""
contentTextField.text = ""
}
return cell
}
// No data available -> show info in first row
else {
if indexPath.row == 0 {
titleLabel.text = "No data"
contentTextField.text = "No data"
}
else {
titleLabel.text = ""
contentTextField.text = ""
}
return cell
}
}
Die enableEditing()
und disableEditing()
Methode aus der Klasse sind FixableTextField
. Ich kann sehen, dass die Textfelder sind immer aktiviert, weil ich das Textfeld Grenze
// Extract from FixableTextField class
func enableEditing() {
self.isEnabled = true
self.borderStyle = .roundedRect
}
func disableEditing() {
self.isEnabled = false
self.borderStyle = .none
}
-Code für den UITextField
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
// Delete empty field indicator "-"
if textField.text == "-" {
textField.text = ""
}
//Move profileTable's contentView to correct position
if textField is FixableTextField {
let path = IndexPath(row: rowMap[(textField as! FixableTextField).purposeID]!, section: 0)
moveContentViewUp(indexPath: path)
}
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
// Save new value to profileUpdateBuffer
do {
try self.profileUpdateBuffer?.setProperty(value: textField.text!, key: (textField as! FixableTextField).purposeID)
} catch ProfileError.PropertySettingWrongType {
let falseInputAlert = UIAlertController(title: "False Input", message: "The input for this field is not valid.", preferredStyle: .alert)
falseInputAlert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
self.present(falseInputAlert, animated: true, completion: nil)
} catch {
print("Error when trying to set property for profileUpdateBuffer in ProfileViewController")
}
// Display new data in table
profileTable.reloadData()
}
Auszug aus setProperty
Methode sehen kann, die von der Klasse ist ProfileData
. profileUpdateBuffer
ist vom Typ ProfileData
func setProperty(value:String, key:String) throws {
switch key {
case "count":
count = value
case "city":
count = value
// ...
case "name":
name = value
default:
throw ProfileError.PropertySettingWrongType
}
}
Bitte senden Sie Ihren Code, damit wir Ihnen helfen können. Vor allem Ihre CellForRowAt indexPath-Funktion. Wie fügen Sie Listener zu Ihren textFields hinzu? –
Danke, natürlich werde ich. – Codey
Haben Sie eine Filterlogik in 'textFieldShouldBeginEditing (_ :)'? Ich sehe, dass Sie auch Ihren VC als Delegierten aller Ihrer Textfelder haben. Haben Sie eine Logik, um zwischen Zellen in Delegiertenmethodenimplementierungen zu unterscheiden? Sie können versuchen, den TextField-Delegaten in der Zelle zu verschieben, damit jede Zelle für sich selbst verantwortlich ist. – kr45ko