почему функция didSelectRowAt indexPath запускается только после касания двумя пальцами? - PullRequest
0 голосов
/ 07 февраля 2019

Строка настраиваемой ячейки моего табличного представления имеет 3 элемента: UITextField, встроенный в UIScrollView, метку и кнопку.Функция didSelectRowAt indexPath запускается ТОЛЬКО в случае одновременного касания любых двух элементов из трех строк.Почему это?Я не добавил никаких сенсорных жестов.

потенциально полезная информация: делегат tableview и dataSource установлены на self.Удаление tableView.reloadData () приведет к тому, что изменения в коде не будут отражены в пользовательском интерфейсе.self.tableView.beginUpdates() & self.tableView.endUpdates() не имеют никакого эффекта.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("test")
    if dataSource.data[indexPath.row].isDataCollapsed() {
        print("expanded")
        dataSource.data[indexPath.row].isCollapsed = false
        tableView.reloadData()
    }
}

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Я прибегал к использованию сенсорных жестов, так как не могпонять это.Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Хорошо, так что я наконец понял это.Оказывается, что

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}

не работает в тандеме с СУЩЕСТВУЮЩИМИ пользовательскими жестами касаний (не уверен, ограничен ли он только жестами касаний или жестами вообще).Это означает, что вы НЕ МОЖЕТЕ активировать жест касания в том же самом View Controller (VC) в то же время, что и tableView, иначе ваша функция didSelectRowAt не будет реагировать на касание должным образом.

Существует два решения этой проблемы.придумали.Одним из них является обходной путь: добавьте пользовательский жест касания, как я делал ранее, и как показано (или аналогично зависимости от вашего варианта использования) ответом @George_E выше, чтобы ваш tableView отвечал на DidSelectRowAt.ИЛИ вы можете работать с другими ранее существовавшими пользовательскими жестами касания в представлении TableView.Под этим я подразумеваю, когда ваш tableView активен и требует некоторого взаимодействия жестов касания, отключите настраиваемые жесты касания.И наоборот, когда tableView неактивен или не требует взаимодействия жестов касания, повторно включите ваши настраиваемые жесты касания.Разместите приведенный ниже код там, где вы хотите отключить / включить ваши собственные жесты:

for gesture in (self.view?.gestureRecognizers)! {
        if gesture.isKind(of: UITapGestureRecognizer.self) {
            gesture.isEnabled = false // or true if you want to enable it
        }
    }
0 голосов
/ 05 марта 2019

Устаревший - см. Принятый ответ


Оригинальный ответ

У меня была такая же проблема, и я не мог ее исправить.Поэтому я решил добавить жест касания, который также анимирует, как раньше.

В моей didMoveToSuperview таблице:

// Set delegates
delegate = self
dataSource = self

// Setup cells
register(MyCustomTableCell.self, forCellReuseIdentifier: "cellId")
allowsSelection = false // <-- Stops the user from tapping with 2
                        //     fingers, creating a permanent selection.

Функция в табличном представлении, где ячейкаis setup (не забудьте инициализировать с помощью пользовательского класса ниже):

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Create cell
      let cell = MyCustomTableCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "cellId")
     /* OR */
      let cell = dequeueReusableCell(withIdentifier: "cellId")

    // Setup cell
    /* ... */

Пользовательский класс, который будет использоваться для ячейки таблицы, чтобы получить то, что мы хотим:

final class MyCustomTableCell: UITableViewCell {

    override func didMoveToSuperview() {
        // Create the tap gesture
        let gesture = UITapGestureRecognizer(target: self, action: #selector(tapGesture(gesture:)))
        addGestureRecognizer(gesture)
    }

    @objc private func tapGesture(gesture: UITapGestureRecognizer) {
        setSelected(true, animated: true)
        setSelected(false, animated: true)
        print("Tap!")
    }
}

Надеюсь, кто-то найдетэто полезно!Обходных путей лучше избегать, но это требовалось в этой ситуации.?

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