Как получить 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.подряд хотя можно, но это не то, что мне нужно.

Так что же мне делать? или что такое "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, тогда это версия swift:

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

если вы хотите напечатать текст 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 of 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
    }

}

как вы можете видеть, с этим кодом вам не нужно иметь дело с optionals и даже не нужно получать ссылку на соответствие UITableViewCell внутри tableView:didSelectRowAtIndexPath: для того, чтобы распечатать нужный текст.


Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let indexPath = tableView.indexPathForSelectedRow
    let currentCell = tableView.cellForRow(at: indexPath!)!
    print(currentCell.textLabel!.text)
}

в моем случае я внес небольшие изменения, когда я ищу значение в tabelview select (didSelectRowAtIndexPath) ячейка возвращает индекс ячейки, поэтому я получаю проблему при перемещении одного viewControler в another.By используя этот метод, я нашел решение для перенаправления на новый viewControler

let indexPath = tableView.indexPathForSelectedRow!
let currentCellValue = tableView.cellForRow(at: indexPath!)! as UITableViewCell
let textLabelText = currentCellValue.textLabel!.text
print(textLabelText) 

сохранить массив, который хранит данные в cellforindexPath способ себя :-

[arryname objectAtIndex:indexPath.row];

используя тот же код в didselectaAtIndexPath метод слишком.. Удачи :)


Это будет работать:

let item = tableView.cellForRowAtIndexPath(indexPath)!.textLabel!.text!

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

Я использую следующий способ, и его работа отлично : -

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

     let cell = tableView.cellForRow(at: indexPath)
     cell?.textLabel?.text = "Selected Row"
}