Подтвердить что ты не робот

Вручную вызовите didSelectRowatIndexPath

Я пытаюсь вызвать didSelectRowAtIndexPath программно, но у меня проблемы.

[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];

Дает мне следующую ошибку:

Использование необъявленного идентификатора 'indexPath'; Вы имели в виду "NSIndexPath"?

Кто-нибудь может мне помочь? Спасибо!

EDIT: Из ответов ниже это звучит так, будто я об этом ошибаюсь. Как я могу получить текст выбранных элементов при нажатии кнопки (может быть несколько вариантов)? Мне нужно сделать это в функции, предназначенной для нажатия кнопки.

4b9b3361

Ответ 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)
        }
    }
}