Как получить 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
метод слишком.. Удачи :)
в 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"
}