だから私は選択した行の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バージョン」とは何ですか?
これを試して:
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のいずれかがnilの場合(有効なインデックスパスでメソッドが呼び出されるため、起こりそうにない)、有効な値が出力されることを確認したい場合は、cell
とtextLabel
の両方が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)")
}
}
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)
}
一致するUITableViewCell
に従ってNSIndexPath
のテキストを印刷する場合は、UITableViewDelegate
のtableView:didSelectRowAtIndexPath:
メソッドを使用し、UITableViewCell
のcellForRowAtIndexPath:
メソッドで選択した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
に従ってモデルのコンテンツ(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
}
}
ご覧のように、このコードを使用すると、オプションを処理する必要がなく、目的のテキストを印刷するためにtableView:didSelectRowAtIndexPath:
内で一致するUITableViewCell
の参照を取得する必要さえありません。
私の場合、私は小さな変更を加えて、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)
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)
}
Swift
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
メソッドでも同じコードを使用しています。幸運を祈ります:)