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?
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)
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)")
}
}
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)
}
Si vous voulez imprimer le texte d'un UITableViewCell
en fonction de sa correspondance NSIndexPath
, vous devez utiliser la méthode UITableViewDelegate
tableView:didSelectRowAtIndexPath:
Et obtenir une référence. de la méthode UITableViewCell
sélectionnée avec UITableView
cellForRowAtIndexPath:
.
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é.
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)
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)
}
Swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexPath = tableView.indexPathForSelectedRow
let currentCell = tableView.cellForRow(at: indexPath!)!
print(currentCell.textLabel!.text)
}
Cela fonctionnera:
let item = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!
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 :)