Как получить textLabel выбранной строки в Swift?
Поэтому я пытаюсь получить значение textLabel выбранной строки. Я попытался напечатать это, но это не сработало. После некоторых исследований я обнаружил, что этот код работает, но только в Objective-C;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"did select and the text is %@",[tableView cellForRowAtIndexPath:indexPath].textLabel.text);]
}
Я не мог найти решение для Swift. Печать indexpath.row возможна, но это не то, что мне нужно.
И что же мне делать? или что такое Swift-версия этого кода?
10 ответов
Попробуй это:
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)
Если вы в классе, унаследованном от UITableViewController
тогда это быстрая версия:
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let cell = self.tableView.cellForRowAtIndexPath(indexPath)
NSLog("did select and the text is \(cell?.textLabel?.text)")
}
Обратите внимание, что cell
является необязательным, поэтому он должен быть развернут - и то же самое для textLabel
, Если любое из 2 равно nil (маловероятно, потому что метод вызывается с допустимым индексным путем), если вы хотите быть уверены, что печатается правильное значение, то вы должны проверить, что оба cell
а также textLabel
оба не равны нулю
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
Чтобы получить метку выбранной строки:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
print(cell.textLabel?.text)
}
Чтобы получить метку невыбранной строки:
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
print(cell.textLabel?.text)
}
В моем случае я сделал небольшие изменения, когда я ищу значение в tabelview выберите (didSelectRowAtIndexPath
) ячейка возвращает индекс ячейки, поэтому у меня возникает проблема при перемещении одного viewControler к другому. Используя этот метод, я нашел решение для перенаправления на новый viewControler
let indexPath = tableView.indexPathForSelectedRow!
let currentCellValue = tableView.cellForRow(at: indexPath!)! as UITableViewCell
let textLabelText = currentCellValue.textLabel!.text
print(textLabelText)
Если вы хотите напечатать текст UITableViewCell
в соответствии с его соответствием NSIndexPath
, вы должны использовать UITableViewDelegate
"s tableView:didSelectRowAtIndexPath:
метод и получить ссылку на выбранный UITableViewCell
с UITableView
"s cellForRowAtIndexPath:
метод.
Например:
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
}
}
Однако по многим причинам я бы не советовал вам использовать предыдущий код. Ваш UITableViewCell
должен нести ответственность только за отображение некоторого контента, заданного моделью. В большинстве случаев вам нужно распечатать содержимое вашей модели (это может быть Array
из String
в соответствии с NSIndexPath
, Делая такие вещи, вы разделите обязанности каждого элемента.
Таким образом, это то, что я бы порекомендовал:
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
}
}
Как видите, с этим кодом вам не нужно иметь дело с опциями и даже не нужно получать ссылку на соответствующий UITableViewCell
внутри tableView:didSelectRowAtIndexPath:
для того, чтобы напечатать нужный текст.
В Swift 4: методом переопределения
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)
}
Свифт 3
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let indexPath = tableView.indexPathForSelectedRow
let currentCell = tableView.cellForRow(at: indexPath!)!
print(currentCell.textLabel!.text)
}
Это будет работать:
let item = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!
Поддерживать массив, который хранит данные в cellforindexPath
сам метод:-
[arryname objectAtIndex:indexPath.row];
Используя тот же код в didselectaAtIndexPath
метод тоже.. удачи:)
Я использовал следующий способ, и он работает нормально:-
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath)
cell?.textLabel?.text = "Selected Row"
}