Як швидко виявити клітинку tableView, яку швидко торкнулися або клацнули по ній


77

Я намагаюся отримати indexвибраний елемент уTableView і почати деяку діяльність після цього. На жаль, більшість рішень, які я знайшов, знаходяться в object-c або не працюють.

Метод func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)не друкуєcell етикетку ..

Хтось може мені допомогти, будь ласка?

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

Після кількох спроб я змінив код на інший із підручника, який я знайшов. І це теж не працює. Зараз я думаю, що це проблема з 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])!")
    }
    
}

Відповіді:


82

Якщо вам потрібно значення з комірки, тоді вам не доведеться відтворювати комірку в didSelectRowAtIndexPath

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

Завдання буде таким:

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

також вам потрібно перевірити, cellForRowAtIndexPathчи потрібно встановити ідентифікатор.

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
}

Сподіваюся, це допоможе.


42

У Swift 3.0

Ви можете знайти подію для дотику / клацання комірки табличного подання за допомогою методу делегування. А також може знайти значення розділу та рядка комірки таким чином.

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

15

Кілька речей, які мають статися ...

  1. Контролер перегляду повинен розширити тип UITableViewDelegate

  2. Контролер перегляду повинен включати didSelectRowAtфункцію.

  3. У поданні таблиці контролером подання повинен бути призначений його делегат.


Нижче наведено одне місце, де може відбуватися призначення делегата (у контролері перегляду).

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

І проста реалізація didSelectRowAtфункції.

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

10

Проблему вирішив сам, використовуючи підручник weheartswift

введіть тут опис зображення


6
Чи обрана відповідь насправді вирішує проблему? Якщо це не вирішує проблему, напишіть рішення у своїй відповіді або виберіть відповідну відповідь, щоб вирішити питання, яке ви задали. Те, що хтось пропонує допомогу та можливе рішення, не означає, що їх відповідь має бути обрана як правильна. Будь ласка, виправте це.
Devbot10,

7

Це мені вдало:

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

Результат повинен бути:

section: 0
row: 0

5
Ваш відповідь з'явиться дублікат, так як ця відповідь здається дуже схожий на відповідь вище stackoverflow.com/a/41583381/40867
jdev

6

Успадковуйте делегата tableview та джерело даних. Реалізуйте делегатів, що вам потрібно.

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

І нарешті реалізуйте цього делегата

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

4

Щоб отримати елементи з Array у клітинку tableView, торкнувшись або клацнувши швидко

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

Я псую кожен раз! Просто переконайтеся, що tableViewделегат і dataSourceоголошено в viewDidLoad. Потім я зазвичай заповнюю кілька масивів для імітації повернутих даних, а потім беру їх звідти!

//******** 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

Вам слід реалізувати функцію didSelect.

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

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.