1
votes

Ouvrir un nouveau ViewController lorsque textField est sélectionné dans le tableauView Swift

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


0 commentaires

5 Réponses :


0
votes

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


3 commentaires

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é.



4
votes

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.


1 commentaires

@wings, heureux de vous aider. :)



0
votes

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.


0 commentaires

0
votes

Dans cellForRow:

if indexPath.row == 3 {
   // Push your controller
}

et dans didSelect:

if indexPath.row == 3 {
    textfield.isUserInteractionEnabled = false
}


0 commentaires

0
votes

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.


0 commentaires