it-roy-ru.com

Как обнаружить ячейку tableView, которой коснулись или щелкнули в swift

Я пытаюсь получить index выбранного элемента в TableView и начать некоторые действия после этого. К сожалению, большинство решений, которые я нашел, находятся в target-c или не работают.

Метод func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) не печатает метку cell.

Может кто-нибудь помочь мне, пожалуйста?

 import UIKit 
 import ResearchKit 
 
 class TaskListViewController: UIViewController, UITableViewDataSource {
 
 let tasks = [("Короткая прогулка") ), 
 ("Аудиометрия"), 
 ("Постукивание пальцем"), 
 ("Время реакции"), 
 ("Пространственная память диапазона") 
] 
 
 
 // сколько разделов в вашей таблице 
 func numberOfSectionsInTableView (tableView: UITableView) -> Int {
 return 1 
} 
 
 // вернуть int, сколько строк 
 func tableView (tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 return tasks.count 
} 
 
 // что такое содержимое 
 
 func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {
 Var cell = UITableViewCell () 
 
 Var (testName) = tasks [indexPath.row] 
 Cell.textLabe l? .text = testName 
 возвращаемая ячейка 
} 
 
 // присваиваем каждому разделу таблицы имя 
 
 func tableView ( tableView: UITableView, titleForHeaderInSection раздел: Int) -> String? {
 
 возвращают "Задачи" 
 
} 
 
 func tableView (tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 
 let indexPath = tableView.indexPathForSelectedRow (); 
 
 let currentCell = tableView.cellForRowAtIndexPath (indexPath!) как UITableViewCell! 
 
 println (currentCell.textLabel! .text) 
} 
 
 
 переопределить func viewDidLoad () {
 super.viewDidLoad () 
 
} 
} 

После нескольких попыток я изменил код на другой, отличный от учебника, который нашел. И это тоже не работает. Теперь я думаю, что это проблема с симулятором iOS ...

 import UIKit 
 import ResearchKit 
 
 class TaskListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
 
 @IBOutlet 
 var tableView: UITableView? 
 var items: [String] = ["We", "Heart", "Swift"] 
 
 переопределяют 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") как! UITableViewCell 
 
 Cell.textLabel? .Text = self.items [indexPath.row] 
 
 Возвращаемая ячейка 
} 
 
 func tableView (tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 println ("Вы выбрали ячейку #\(items [indexPath.row])!") 
} 
 
} 
 
60
pawisoon

Если вы хотите получить значение из ячейки, вам не нужно заново создавать ячейку в переменной 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
}

Надеюсь, поможет.

47
Ashish Kakkad

В Swift 3.0

Вы можете найти событие для касания/щелчка ячейки табличного представления через метод делегата. Кроме того, можно найти значение раздела и строки ячейки, как это.

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

Несколько вещей, которые должны произойти ...

  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)")
}
6
spencer.sm

Это сработало хорошо для меня:

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

Выход должен быть:

section: 0
row: 0
5
Mr Duck

Проблема была решена самостоятельно с помощью учебника weheartswift

 enter image description here

4
pawisoon

Унаследуйте делегат tableview и источник данных . Реализуйте делегаты, что вам нужно.

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

И, наконец, реализовать этот делегат

     func tableView(_ tableView: UITableView, didSelectRowAt  
     indexPath: IndexPath) {
     print("row selected : \(indexPath.row)")
  }
3
Pankaj Jangid
 # 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
Prabhat Pandey

Чтобы получить элементы из массива в ячейке tableView, коснувшись или щелкнув в Swift

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)")
}
2
Sanjay Mali

Я облажался каждый раз! Просто убедитесь, что делегат 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
Lexter