Различать касание UITableView и программный выбор?

Я хочу вызывать разные методы в зависимости от того, касается ли пользователь ячейки UITableView или она выбрана программно. Однако я не могу их разделить; программный запускает все в didSelectRowAt indexPath. Есть ли способ использовать их более независимо?

Вот мой программный код:

func selectTableViewRowProgrammatically() {

    let indexPath = IndexPath(row: someVar, section: 0);
    self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
    self.tableView(self.tableView, didSelectRowAt: indexPath)

}

Спасибо!


person moosgrn    schedule 12.02.2019    source источник
comment
Не уверен, какова ваша цель, но проверьте ее func setSelected() developer.apple.com/documentation/ uikit/uitableviewcell/   -  person Tieda Wei    schedule 13.02.2019


Ответы (1)


Что вы хотите, чтобы приложение делало, когда вы выбираете ячейку таблицы вручную, а не когда вы вызываете ее программно?

В настоящее время ваш программный способ вызывает тот же метод, который вызывается при нажатии на ячейку, то есть tableView(_:didSelectRowAt:).

Поэтому, если вы хотите выполнить какие-либо дополнительные вычисления, просто добавьте его в свой метод selectTableViewRowProgrammatically до или после вызова self.tableView(self.tableView, didSelectRowAt: indexPath).

Чтобы выделить ячейку программно, вы можете вызвать selectRow(at:animated:scrollPosition:)< /а>.

Обратите внимание на часть Discussion в документации:

Вызов этого метода не приводит к тому, что делегат получает сообщение tableView(:willSelectRowAt:) или tableView(:didSelectRowAt:), а также не отправляет уведомления selectionDidChangeNotification наблюдателям.

person Martin Dinh    schedule 12.02.2019
comment
Это великая мысль; Благодарность!. К сожалению, я не могу организовать свой рабочий процесс так, чтобы он полностью работал. Некоторые из вещей, которые мне нужно запускать при нажатии, — это то, что я не хочу запускать при расширении через UIButton. Еще один способ, которым я мог бы достичь желаемого результата, - это программно выделять строки (независимо от того, выбраны они или нет), однако я еще не нашел документацию, которая работала для меня. - person moosgrn; 13.02.2019
comment
Я не уверен на 100%, если я правильно вас понял. Итак, вы хотите выделить ячейку программно? Пробовали ли вы: selectRow(at:animated:scrollPosition:). Обратите внимание на часть Discussion в документации: Calling this method does not cause the delegate to receive a tableView(_:willSelectRowAt:) or tableView(_:didSelectRowAt:) message, nor does it send selectionDidChangeNotification notifications to observers. - person Martin Dinh; 13.02.2019
comment
Спасибо!! Я искал это решение в течение нескольких дней. Я не знал, что selectRow можно вызвать без включения в него «tableView (tableView, didSelectRowAt: indexPath)». Как только я удалил это, я получил возможность выделения, которую я могу использовать для решения своей проблемы. Я был бы рад отметить этот комментарий как ответ, если вы переместите его. - person moosgrn; 13.02.2019