UIContextualAction запускает setEditing = true, как это отключить? - PullRequest
0 голосов
/ 26 декабря 2018

Я только что реализовал trailingSwipeActionsConfigurationForRowAt и leadingSwipeActionsConfigurationForRowAt, чтобы добавить действия смахивания к моим UITableViewCell с.

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration

Это вызывает (на моем UITableViewController) func setEditing(_ editing: Bool, animated: Bool) для вызова с editing = true, что, в свою очередь, также вызывает мою анимацию редактирования и другие изменения, которые я хочу при переходе в режим редактирования.(Контекстуальные действия не связаны с редактированием / удалением).

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

Есть идеи?

1 Ответ

0 голосов
/ 27 декабря 2018

Мне удалось решить эту проблему, вызвав «реальный» режим редактирования по-другому.

На моем UITableViewController:

class MyTableViewController: UITableViewController {
  var realEditMode: Bool = false

  func setRealEditing(_ editing: Bool) {
    realEditMode = editing
    setEditing(realEditMode, animated: true)
  }

  // See Note 1 below
  @available(iOS 11.0, *)
  override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration {
    guard let item = itemForIndexPath(indexPath) else {
      return UISwipeActionsConfiguration(actions: [])
    }

    if realEditMode {
      return UISwipeActionsConfiguration(actions: [
        buildActionConfiguration(.delete, fromIndexPath: indexPath)
      ])
    } else {
      return UISwipeActionsConfiguration(actions: [
        buildActionConfiguration(.read, fromIndexPath: indexPath)
      ])
    }
  }

  @available(iOS 11.0, *)
  func buildActionConfiguration(_ action: MyCellActionEnum, fromIndexPath indexPath: IndexPath) -> UIContextualAction {
    // logic to build `UIContextualAction`
  }
}

И в моем UITableViewCell проверьте, если *Флаг 1008 * устанавливается путем ручного запуска или запуска редактирования пролистывания:

class MyCell: UITableViewCell {
  var myTableViewController: MyTableViewController?

  override func setEditing(_ editing: Bool, animated: Bool) {
    if editing && !(myTableViewController?.realEditMode ?? true) {
        return
    }

    super.setEditing(editing, animated: animated)
  }
}

Затем вместо кнопок редактирования в пользовательском интерфейсе я изменил setEditing(true/false, animated: true) на setRealEditing(true/false).

Примечание 1

Одна проблема, которую я обнаружил, заключалась в том, что при использовании trailingSwipeActionsConfigurationForRowAt кнопка удаления (⛔️) больше не работала.Нажатие на него не вызывало подтверждение.

Я обнаружил, что должен существовать trailingSwipeActionsConfigurationForRowAt с UIContextualAction, который был инициализирован с UIContextualAction(style: .destructive) (т.е. имел деструктивный стиль).Это элемент, который затем используется для отображения подтверждения удаления.

Однако я не хотел, чтобы этот элемент был виден, когда использовались обычные действия смахивания, поэтому отображать его можно только в одном «режиме реального редактирования». Iиспользовал флаг realEditMode.

Это сработало для меня и не выглядело слишком глупо.Если появится что-то более официальное, я более чем рад изменить принятый ответ.

...