Cómo detectar una celda de tableView tocada o en la que se hizo clic en Swift


77

Estoy tratando de ingresar el indexelemento seleccionado TableViewy comenzar alguna actividad después de eso. Desafortunadamente, la mayoría de las soluciones que encontré están en objetivo-c o no funcionan.

El método func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)no imprime la celletiqueta ...

¿Alguien puede ayudarme por favor?

import UIKit
import ResearchKit

class TaskListViewController: UIViewController, UITableViewDataSource {
    
    let tasks=[("Short walk"),
        ("Audiometry"),
        ("Finger tapping"),
        ("Reaction time"),
        ("Spatial span memory")
    ]
    
    
    //how many sections are in your table
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    //return int how many rows
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count
    }
    
    //what are the contents
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
        
        var (testName) = tasks[indexPath.row]
        cell.textLabel?.text=testName
        return cell
    }
    
    // give each table section a name
    
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        return "Tasks"
        
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
        let indexPath = tableView.indexPathForSelectedRow();
        
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!
        
        println(currentCell.textLabel!.text)
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }  
}

Después de algunos intentos, cambié el código a uno diferente del tutorial que encontré. Y tampoco funciona. Ahora estoy pensando que este es el problema con el simulador de iOS ...

import UIKit
import ResearchKit

class TaskListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet
    var tableView: UITableView?
    var items: [String] = ["We", "Heart", "Swift"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }
    
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count;
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = self.tableView!.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
        
        cell.textLabel?.text = self.items[indexPath.row]
        
        return cell
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("You selected cell #\(items[indexPath.row])!")
    }
    
}

Respuestas:


82

Si desea el valor de la celda, no tiene que volver a crear la celda en el didSelectRowAtIndexPath

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    println(tasks[indexPath.row])
}

La tarea sería la siguiente:

let tasks=["Short walk",
    "Audiometry",
    "Finger tapping",
    "Reaction time",
    "Spatial span memory"
]

también tienes que comprobar el cellForRowAtIndexPathtienes que configurar el identificador.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell
    var (testName) = tasks[indexPath.row]
    cell.textLabel?.text=testName
    return cell
}

Espero eso ayude.


42

En Swift 3.0

Puede encontrar el evento al tocar / hacer clic en la celda de tableview a través de su método de delegado. Además, puede encontrar la sección y el valor de la fila de la celda de esta manera.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       print("section: \(indexPath.section)")
       print("row: \(indexPath.row)")
}

15

Un par de cosas que deben suceder ...

  1. El controlador de vista necesita extender el tipo UITableViewDelegate

  2. El controlador de vista debe incluir la didSelectRowAtfunción.

  3. La vista de tabla debe tener el controlador de vista asignado como su delegado.


A continuación se muestra un lugar donde podría tener lugar la asignación del delegado (dentro del controlador de vista).

override func loadView() {
    tableView.dataSource = self
    tableView.delegate = self
    view = tableView
}

Y una implementación simple de la didSelectRowAtfunción.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("row: \(indexPath.row)")
}

10

El problema fue resuelto por mí mismo usando el tutorial de weheartswift

ingrese la descripción de la imagen aquí


6
¿La respuesta seleccionada realmente soluciona el problema? Si no soluciona el problema, escriba una solución en su respuesta o seleccione la respuesta adecuada para solucionar la pregunta que hizo. El hecho de que alguien ofrezca ayuda y una posible solución no significa que su respuesta deba seleccionarse como la correcta. Por favor arregle esto.
Devbot10

7

Esto funcionó bien para mí:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("section: \(indexPath.section)")
        print("row: \(indexPath.row)")
    }

La salida debe ser:

section: 0
row: 0

5
Su respuesta parece duplicada, ya que esta respuesta es muy similar a la respuesta anterior stackoverflow.com/a/41583381/40867
jdev

6

Hereda el delegado de tableview y la fuente de datos. Implemente delegados lo que necesite.

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

Y finalmente implementar este delegado

     func tableView(_ tableView: UITableView, didSelectRowAt  
     indexPath: IndexPath) {
     print("row selected : \(indexPath.row)")
  }

4

Para obtener un elemento de Array en la celda tableView, se toca o se hace clic en rápido

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexpath = arr_AsianCountries[indexPath.row]
print("indexpath:\(indexpath)")
}

3
 # Check delegate? first must be connected owner of view controller

    # Simple implementation of the didSelectRowAt function.

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
         print("row selection: \(indexPath.row)")
    }

2

¡Me equivoco cada vez! Solo asegúrese de que el tableViewdelegado y dataSourceestén declarados en viewDidLoad. Luego, normalmente lleno algunas matrices para simular los datos devueltos y luego los tomo desde allí.

//******** Populate Table with data ***********
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? SetupCellView
    cell?.ControllerLbl.text = ViewContHeading[indexPath.row]
    cell?.DetailLbl.text = ViewContDetail[indexPath.row]
    cell?.StartupImageImg.image = UIImage(named: ViewContImages[indexPath.row])
    return cell!
}

0

Debe implementar la función didSelect.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 print("User touched on \(indexpath) row") 

}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.