Как получить 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"
}
Другие вопросы по тегам