Вручную вызовите didSelectRowatIndexPath
Я пытаюсь вызвать didSelectRowAtIndexPath программно, но у меня проблемы.
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
Дает мне следующую ошибку:
Использование необъявленного идентификатора 'indexPath'; Вы имели в виду "NSIndexPath"?
Кто-нибудь может мне помочь? Спасибо!
EDIT: Из ответов ниже это звучит так, будто я об этом ошибаюсь. Как я могу получить текст выбранных элементов при нажатии кнопки (может быть несколько вариантов)? Мне нужно сделать это в функции, предназначенной для нажатия кнопки.
Ответы
Ответ 1
Вам нужно передать действительный аргумент, если вы не объявили indexPath
в области вызова, тогда вы получите эту ошибку. Попробуйте:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:ROW_YOU_WANT_TO_SELECT inSection:SECTION_YOU_WANT_TO_SELECT]
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
Где ROW_YOU_WANT...
должны быть заменены строкой и секцией, которую вы хотите выбрать.
Однако вы действительно никогда не должны называть это напрямую. Извлеките работу, выполняемую внутри tableView:didSelectRowAtIndexPath:
, в отдельные методы и вызовите их напрямую.
Чтобы ответить на обновленный вопрос, вам нужно использовать метод indexPathsForSelectedRows
на UITableView
. Представьте, что вы заполняли текст ячейки таблицы из массива массивов строк, что-то вроде этого:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tv dequeue...];
NSArray *rowsForSection = self.sectionsArray[indexPath.section];
NSString *textForRow = rowsForSection[indexPath.row];
cell.textLabel.text = textForRow;
return cell;
}
Затем, чтобы получить весь выделенный текст, вы хотите сделать что-то вроде:
NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];
NSMutableArray *selectedTexts = [NSMutableArray array];
for (NSIndexPath *indexPath in selectedIndexPaths) {
NSArray *section = self.sectionsArray[indexPath.section];
NSString *text = section[indexPath.row];
[selectedTexts addObject:text];
}
selectedTexts
будет в этот момент содержать всю выбранную информацию. Надеюсь, этот пример имеет смысл.
Ответ 2
Решение Swift 3.0
Вручную вызовите didSelectRowAtIndexPath
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true)
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
Ответ 3
Чтобы обновить @Sourabh answer, обратите внимание, что при вызове selectRow
вы также можете указать scrollPosition
:
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true)
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
становится:
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: top) // <--
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
возможные константы:
none
В представлении таблицы прокручивается строка, представляющая интерес, чтобы быть полностью видимой с помощью минимум движения. Если строка уже полностью видима, прокрутка имеет место. Например, если строка находится над видимой областью, поведение идентично тому, что указано сверху. Это значение по умолчанию.
top
В представлении таблицы прокручивается строка, представляющая интерес, к вершине видимой табличный вид.
middle
В представлении таблицы прокручивается интересующая строка до середины видимый вид таблицы.
bottom
В представлении таблицы прокручивается интересующая строка в нижней части видимый вид таблицы.
Ответ 4
Вам нужно определить переменную indexPath, если у вас ее еще нет.
Что-то вроде:
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
Ответ 5
Начиная с Mistalis answer, я сделал этот небольшой класс ExtendedCell
, потому что я использую его в нескольких табличных представлениях.
Использование в виде таблицы:
// Here MyTableView is UITableView and UITableViewDelegate
// but you can separate them.
class MyTableView: UITableView, UITableViewDelegate {
override func dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? {
return MyCell(identifier: identifier, table: self)
}
// ...
}
Реализация вашей ячейки:
class MyCell : ExtendedCell {
convenience init(identifier: String?, table: MyTableView)
{
// in this example, MyTableView is both table and delegate
self.init(identifier: identifier, table: table, delegate: table)
// ...
}
// At any moment you may call selectTableRow() to select
// the row associated to this cell.
func viewItemDetail() {
selectTableRow()
}
}
ExtendedCell
класс:
import UIKit
/**
* UITableViewCell with extended functionality like
* the ability to trigger a selected row on the table
*/
class ExtendedCell : UITableViewCell {
// We store the table and delegate to trigger the selected cell
// See: https://stackoverflow.com/q/18245441/manually-call-did-select-row-at-index-path
weak var table : UITableView!
weak var delegate : UITableViewDelegate!
convenience init(identifier: String?, table: UITableView, delegate: UITableViewDelegate)
{
self.init(style: .default, reuseIdentifier: identifier)
self.table = table
self.delegate = delegate
}
func selectTableRow()
{
if let indexPath = table.indexPath(for: self) {
table.selectRow(at: indexPath, animated: true, scrollPosition: .none)
delegate.tableView!(table, didSelectRowAt: indexPath)
}
}
}