Почему -didDeselectRowAtIndexPath не вызывается? - PullRequest
24 голосов
/ 22 марта 2012

Я создал новый проект (Xcode 4, приложение Master-Detail), чтобы посмотреть, делаю ли я что-то не так, но у меня все еще есть та же проблема.Я хочу позвонить -reloadData, когда пользователь отменяет выбор ячейки, поэтому это мой код:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [tableView reloadData];
}

-(NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    return indexPath;
}

Проблема в том, что didDeselectRowAtIndexPath и willDeselectRowAtIndexPath не кажутсябыть названным.Это ожидаемое поведение?Документы для tableView:didDeselectRowAtIndexPath: state

Сообщает делегату, что указанная строка сейчас отменена.

, поэтому я предполагаю, что она должна работать так, как я думал.

Ответы [ 8 ]

52 голосов
/ 26 марта 2012

Если вы вызываете deselectRowAtIndexPath:animated:, методы делегата tableView:willDeselectRowAtIndexPath: и tableView:didDeselectRowAtIndexPath: сообщения не отправляются.

23 голосов
/ 22 марта 2012

документация tableView:willDeselectRowAtIndexPath: также говорит, что

Этот метод вызывается, только если существует существующий выбор, когда Пользователь пытается выбрать другую строку. Делегату отправляется этот метод для ранее выбранной строки. Ты можешь использовать UITableViewCellSelectionStyleNone , чтобы отключить отображение выделение ячейки при касании.

Это не сработало для нас, когда я использовал UITableViewCellSelectionStyleNone.

12 голосов
/ 27 мая 2012

Я обнаружил еще одну причуду - во всяком случае, в IOS 5.1 - если вы вызовете reloadData для таблицы, вы не получите didDeselectRowAtIndexPath для любых выбранных строк.В моем случае я немного корректирую расположение ячеек в зависимости от того, выбран он или нет, поэтому мне пришлось вручную выполнить эту работу до перезагрузки данных таблицы.

7 голосов
/ 28 октября 2014

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой.

Если вы используете

[tableView reloadData]

Тогда данные таблицы перезагружаются, и послесцены - значение

только

didSelectRowAtIndexPath

когда-либо называлось.Я надеюсь, что это поможет кому-то, кто сталкивается с этой проблемой.

4 голосов
/ 04 февраля 2016

Чистый способ решения этой проблемы заключается в следующем:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath)
    // Do your cell setup work here...

    //If your cell should be selected...
    if cellShouldBeSelected {
        tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
    }

    return cell
}

Это решает всю проблему с ячейкой, которая не отвечает на отмену выбора после вызова tableView.reloadData().

2 голосов
/ 21 мая 2017

Когда любая ячейка выбрана в первый раз, метод -[UITableViewDelegate tableView:didDeselectRowAtIndexPath:] не вызывается, а -[UITableViewDelegate tableView:didSelectRowAtIndexPath:].Сразу после выбора еще одной ячейки, didDeselectRowAtIndexPath вызывается сразу после didSelectRowAtIndexPath.

Это нормально.

Но если вам нужно показать ячейкукак было выбрано в начале (например, используя UITableViewCellAccessoryCheckmark), затем, после выбора другой ячейки, вы, вероятно, захотите, чтобы метод didDeselectRowAtIndexPath вызывался в первый раз, чтобы отменить выбор предыдущей ячейки.решение!

Вы должны вызвать -[UITableView selectRowAtIndexPath:animated:scrollPosition:] в -[UITableViewDataSource tableView:cellForRowAtIndexPath:], чтобы сообщить, что нужная ячейка уже выбрана.

Objective-C

#pragma mark - UITableViewDelegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    // saving the current selected row
    SelectedRow = indexPath.row;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryNone;
}

#pragma mark - UITableViewDataSource

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    // preventing selection style
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.textLabel.text = "Some text";

    if (indexPath.row == SelectedRow) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        // just wanted to make it selected, but it also can scroll to the selected position
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }

    return cell;
}

Swift 3.1

// MARK: - UITableViewDelegate

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)!
    cell.accessoryType = UITableViewCellAccessoryType.checkmark
    selectedRow = indexPath.row
}

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)!
    cell.accessoryType = UITableViewCellAccessoryType.none
}

// MARK: - UITableViewDataSource

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")

    // preventing selection style
    cell.selectionStyle = UITableViewCellSelectionStyle.none

    cell.textLabel?.text = "some text"

    if (indexPath.row == selectedRow) {
        cell.accessoryType = UITableViewCellAccessoryType.checkmark
        // just wanted to make it selected, but it also can scroll to the selected position
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
    }

    return cell
}
1 голос
/ 26 апреля 2013

Установите allowsMultipleSelection для этого табличного представления в TRUE

  self.tableView.allowsMultipleSelection = YES;
0 голосов
/ 18 мая 2014

Я думаю, это просто простая ошибка!Почему бы вам не использовать следующее:

[self.tableView deselectRowAtIndexPath:indexPath animated:YES];

Вместо использования только "tableView" в этой строке?Я думаю, и уверен, что вышеупомянутая линия даст вам решение!надеюсь, это помогло вам, если вы оглянулись на свой старый вопрос !!!Престижность!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...