web-dev-qa-db-ja.com

選択した行の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バージョン」とは何ですか?

34

これを試して:

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)
119
derdida

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のいずれかがnilの場合(有効なインデックスパスでメソッドが呼び出されるため、起こりそうにない)、有効な値が出力されることを確認したい場合は、celltextLabelの両方がnilでないことを確認する必要があります:

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)")
    }
}
13
Antonio

Swift 4

selected行のラベルを取得するには:

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)
}
5
John R Perry

一致するUITableViewCellに従ってNSIndexPathのテキストを印刷する場合は、UITableViewDelegatetableView:didSelectRowAtIndexPath:メソッドを使用し、UITableViewCellcellForRowAtIndexPath:メソッドで選択したUITableViewの参照を取得する必要があります。

例えば:

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に従ってモデルのコンテンツ(StringNSIndexPathになる可能性がある)を印刷することです。このようなことを行うことにより、各要素の責任を分離します。

それにより、これは私が推奨するものです:

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
    }

}

ご覧のように、このコードを使用すると、オプションを処理する必要がなく、目的のテキストを印刷するためにtableView:didSelectRowAtIndexPath:内で一致するUITableViewCellの参照を取得する必要さえありません。

2
Imanou Petit

私の場合、私は小さな変更を加えて、tabelviewで値を検索すると(didSelectRowAtIndexPath)セルがセルのインデックスを返すので、1つのviewControlerを別のviewControlerに移動する際に問題が発生します。新しいviewControlerにリダイレクトするソリューション

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

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)
}
1
Sachin Rasane

Swift

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

これは動作します:

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

cellforindexPathメソッド自体にデータを格納する配列を維持します:-

[arryname objectAtIndex:indexPath.row];

didselectaAtIndexPathメソッドでも同じコードを使用しています。幸運を祈ります:)

0