почему функция «didSelectRowAt indexPath» работать только после того, как два пальца крана?

Вопрос задан: 8 месяцев назад Последняя активность: 6 месяцев назад
up 1 down

Мой вид таблицы пользовательских ячейки строка имеет 3 элемента: UITextField встраивается в UIScrollView, этикетке, и кнопки. Функция «didSelectRowAt indexPath» работает только когда какой-либо 2 из элементов 3-рядных одновременно прослушиваться. Почему это? Я не добавлял никаких жестов.

потенциально полезная информация: TableView Делегат и DataSource устанавливаются самостоятельно. Удаление 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 ответа

up 2 down accepted

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

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

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

Есть два решения этого я придумал. Один обходной путь: добавление пользовательского крана жест, как я делал ранее, и, как показано на рисунке (или аналогичные в зависимости от вашего использования случае) ответ @George_E «s выше, чтобы получить ваш 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
        }
    }
up 0 down

Устаревший - См принял ответ


первоначально заявленное возражение против иска

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

В моей 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.

Функция в виде таблицы, где ячейка создана (не забудьте инициализировать пользовательский класс внизу):

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!")
    }
}

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