J'utilise un textField dans ma tableView et j'obtiens des données différentes en utilisant indexPath.row mais le problème est que j'essaie d'ouvrir un nouveau ViewController lorsqu'un champ de texte particulier est sélectionné dans tableView .
Classe UITableViewCell:
extension AddCustomerViewController: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
if let indexPath = self.tableView.indexPath(forItem: textField) {
if indexPath.row == 0 {
//firstName
self.fullName = textField.text ?? ""
}
else if indexPath.row == 1 {
//lastName
self.email = textField.text ?? ""
}
else if indexPath.row == 2 {
//userId
self.phoneNumber = textField.text ?? ""
}
else if indexPath.row == 3 {
//asm
self.areaSalesMen = textField.text ?? ""
let vc = AreaSalesMenListViewController.instantiate(fromAppStoryboard: .Main)
self.navigationController?.pushViewController(vc, animated: true)
}
Source de données UITableView et méthode déléguée: -
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexPath = tableView.indexPathForSelectedRow!
print("index \(indexPath.row)")
if indexPath.row == 0 {
print("full name is selceted")
}
else if indexPath.row == 1 {
}
else if indexPath.row == 2 {
}
else if indexPath.row == 3 {
let vc = AreaSalesMenListViewController.instantiate(fromAppStoryboard: .Main)
self.navigationController?.pushViewController(vc, animated: true)
}
5 Réponses :
Au lieu de pousser votre viewController dans textFieldDidEndEditing , écrivez-le dans textfieldShouldBeginEditing , comme lorsque vous appuyez sur un textField le premier délégué à être appelé est textFieldShouldBeginEditing .
extension AddCustomerViewController : UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) {
if let indexPath = self.tableView.indexPath(forItem: textField) {
if indexPath.row == 3 {
//asm
self.areaSalesMen = textField.text ?? ""
let vc = AreaSalesMenListViewController.instantiate(fromAppStoryboard: .Main)
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
}
Cela fonctionne mais le problème est que lorsque je clique sur le bouton Terminé, il ouvre un nouveau contrôleur mais pas lorsque TextField commence à éditer
Oui. Cela se produit parce que vous avez poussé votre contrôleur dans DidEndEditing , il est appelé lorsque l'édition est terminée, par exemple en appuyant sur le bouton Terminé, appuyez à l'intérieur de shouldBeginEditing puis chaque fois que vous appuyez sur textField, vous serez poussé vers votre prochain contrôleur.
Je suis confronté à un autre problème: lorsque vous passez au nouveau contrôleur de vue, le clavier n'est pas ignoré, de sorte qu'il passe à nouveau au contrôleur de vue lorsque le bouton retour est enfoncé.
Dans la méthode cellForRow , ajoutez la ligne suivante pour définir la balise de textField:
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.tag == 3 {
textField.resignFirstResponder()
self.areaSalesMen = textField.text ?? ""
let vc = AreaSalesMenListViewController.instantiate(fromAppStoryboard: .Main)
self.navigationController?.pushViewController(vc, animated: true)
}
}
Dans textFieldDidBeginEditing , ajoutez le code suivant pour détecter le textField sélectionné dans La quatrième ligne signifie indexPath.row == 3 .
cell.textfield.tag = indexPath.row
J'espère que cela vous aidera.
@wings, heureux de vous aider. :)
Dans textFieldShouldBeginEditing , ajoutez votre code pour naviguer et ensuite renvoyez false.
textFieldShouldBeginEditing est la première méthode qui est appelée, cela détermine si le textField doit commencer à éditer ou non, puisque vous ne voulez pas que l'utilisateur entre de texte, vous pouvez retourner false à partir de cette méthode déléguée et effectuez votre navigation.
Dans cellForRow:
if indexPath.row == 3 {
// Push your controller
}
et dans didSelect:
if indexPath.row == 3 {
textfield.isUserInteractionEnabled = false
}
Vérifiez UITextFieldDelegate.
Surtout la fonction textFieldDidBeginEditing.
Cette fonction indique au délégué que l'édition a commencé dans le champ de texte spécifié.
Mettez donc votre code dans cette fonction.