web-dev-qa-db-fra.com

Comment obtenir textLabel de la ligne sélectionnée en swift?

Donc, j'essaie d'obtenir la valeur du textLabel de la ligne que je sélectionne. J'ai essayé de l'imprimer, mais cela n'a pas fonctionné. Après quelques recherches, j'ai découvert que ce code fonctionnait, mais seulement en Objective-C;

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath    *)indexPath
    {
        NSLog(@"did select  and the text is %@",[tableView cellForRowAtIndexPath:indexPath].textLabel.text);]
    }

Je n'ai trouvé aucune solution pour Swift. L'impression du fichier indexpath.row est possible, mais ce n'est pas ce dont j'ai besoin.

donc qu'est ce que je devrais faire? ou quelle est la "version rapide" de ce code?

34

Essaye ça:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let indexPath = tableView.indexPathForSelectedRow() //optional, to get from any UIButton for example

    let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell

    print(currentCell.textLabel!.text)
119
derdida

Si vous êtes dans une classe héritée de UITableViewController, alors voici la Swift version:

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = self.tableView.cellForRowAtIndexPath(indexPath)
    NSLog("did select and the text is \(cell?.textLabel?.text)")
}

Notez que cell est optionnel, il doit donc être déballé - de même pour textLabel. Si l'un des 2 est nul (cela est peu probable car la méthode est appelée avec un chemin d'index valide), si vous voulez être sûr qu'une valeur valide est imprimée, vous devez alors vérifier que cell et textLabel ne sont pas tous les deux nuls:

override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = self.tableView.cellForRowAtIndexPath(indexPath)
    let text = cell?.textLabel?.text
    if let text = text {
        NSLog("did select and the text is \(text)")
    }
}
13
Antonio

Swift 4

Pour obtenir l'étiquette de la rangée sélectionnée:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
    print(cell.textLabel?.text)
}

Pour obtenir l'étiquette de la ligne désélectionnée:

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
    print(cell.textLabel?.text)
}
5
John R Perry

Si vous voulez imprimer le texte d'un UITableViewCell en fonction de sa correspondance NSIndexPath, vous devez utiliser la méthode UITableViewDelegatetableView:didSelectRowAtIndexPath: Et obtenir une référence. de la méthode UITableViewCell sélectionnée avec UITableViewcellForRowAtIndexPath:.

Par exemple:

import UIKit

class TableViewController: UITableViewController {

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        switch indexPath.row {
        case 0: cell.textLabel?.text = "Bike"
        case 1: cell.textLabel?.text = "Car"
        case 2: cell.textLabel?.text = "Ball"
        default: cell.textLabel?.text = "Boat"
        }

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let selectedCell = tableView.cellForRowAtIndexPath(indexPath)
        print(selectedCell?.textLabel?.text)
        // this will print Optional("Bike") if indexPath.row == 0
    }

}

Cependant, pour de nombreuses raisons, je ne vous encouragerais pas à utiliser le code précédent. Votre UITableViewCell ne devrait être responsable que d'afficher du contenu donné par un modèle. Dans la plupart des cas, ce que vous voulez, c'est imprimer le contenu de votre modèle (cela pourrait être un Array sur String) selon un NSIndexPath. En procédant de la sorte, vous séparerez les responsabilités de chaque élément.

Voici ce que je recommanderais:

import UIKit

class TableViewController: UITableViewController {

    let toysArray = ["Bike", "Car", "Ball", "Boat"]

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return toysArray.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.text = toysArray[indexPath.row]
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let toy = toysArray[indexPath.row]
        print(toy)
        // this will print "Bike" if indexPath.row == 0
    }

}

Comme vous pouvez le constater, avec ce code, vous n’avez pas à vous occuper d’options ni même à obtenir une référence de la correspondance UITableViewCell à l’intérieur de tableView:didSelectRowAtIndexPath: Pour imprimer le fichier. texte désiré.

2
Imanou Petit

Dans mon cas, j’ai fait de petits changements, lorsque j’ai cherché la valeur dans tabelview, sélectionnez (didSelectRowAtIndexPath) la cellule pour qu’elle retourne l’index de la cellule, ce qui pose un problème de déplacement entre viewControler et un autre.En utilisant cette méthode, j’ai trouvé une solution pour rediriger vers un nouveau viewControler

let indexPath = tableView.indexPathForSelectedRow!
let currentCellValue = tableView.cellForRow(at: indexPath!)! as UITableViewCell
let textLabelText = currentCellValue.textLabel!.text
print(textLabelText) 
1
Bala Murugan

Dans Swift 4: par méthode prioritaire

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let storyboard = UIStoryboard(name : "Main", bundle: nil)
        let next vc = storyboard.instantiateViewController(withIdentifier: "nextvcIdentifier") as! NextViewController

       self.navigationController?.pushViewController(prayerVC, animated: true)
}
1
Sachin Rasane

Swift

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexPath = tableView.indexPathForSelectedRow
    let currentCell = tableView.cellForRow(at: indexPath!)!
    print(currentCell.textLabel!.text)
}
1
MrMins

Cela fonctionnera:

let item = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!
0
Floyd Resler

Maintenir un tableau qui stocke les données dans la méthode cellforindexPath elle-même: -

[arryname objectAtIndex:indexPath.row];

Utiliser le même code dans la méthode didselectaAtIndexPath aussi .. Bonne chance :)

0
Pradheep Narendran