Лист обнаружения был отклонен на iOS 13 - программирование

Лист обнаружения был отклонен на iOS 13

До iOS 13 представлены контроллеры представления, используемые для охвата всего экрана. И, в случае отклонения, viewDidAppear функция viewDidAppear родительского контроллера представления.

Теперь iOS 13 будет представлять контроллеры представления как лист по умолчанию, что означает, что карта будет частично покрывать базовый контроллер представления, что означает, что viewDidAppear не будет вызываться, потому что родительский контроллер представления фактически никогда не исчезал.

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

4b9b3361

Ответ 1

  Есть ли способ обнаружить, что представленный лист контроллера представления был отклонен?

Да.

Какую-то другую функцию, которую я могу переопределить в родительском контроллере представления, вместо того, чтобы использовать какой-то делегат?

Нет. "Какой-то делегат" - это то, как вы это делаете. Сделайте себя делегатом контроллера представления и переопределите presentationControllerDidDismiss(_:).

https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/3229889-presentationcontrollerdiddismiss

Ответ 2

Другой вариант возврата viewWillAppear и viewDidAppear установлен

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen

эта опция покрывает весь экран и после увольнения вызывает вышеуказанные методы

Ответ 3

Здесь пример кода родительского контроллера представления, который уведомляется, когда дочерний контроллер представления представляет в виде листа (то есть способом по умолчанию для iOS 13), отклоняется:

public final class Parent: UIViewController, UIAdaptivePresentationControllerDelegate
{
  // This is assuming that the segue is a storyboard segue; 
  // if you're manually presenting, just see the delegate there.
  public override func prepare(for segue: UIStoryboardSegue, sender: Any?)
  {
    if segue.identifier == "mySegue" {
      segue.destination.presentationController?.delegate = self;
    }
  }

  public func presentationControllerDidDismiss(
    _ presentationController: UIPresentationController)
  {
    // Only called when the sheet is dismissed by DRAGGING.
    // You'll need something extra if you call .dismiss() on the child.
    // (I found that overriding dismiss in the child and calling
    // presentationController.delegate?.presentationControllerDidDismiss
    // works well).
  }
}

Ответ Jerland2 сбит с толку, так как (а) первоначальный спрашивающий хотел получить вызов функции при отклонении листа (тогда как он реализовал presentationControllerDidAttemptToDismiss, который вызывается, когда пользователь пытается и не может отклонить запрос листа), и (b) установка isModalInPresentation полностью ортогональна и фактически сделает представленный лист неотразимым (что противоположно тому, что хочет OP).

Ответ 4

Для будущих читателей вот более полный ответ с реализацией:

  1. В корневом представлении контроллеры готовятся к переходу и добавьте следующее (при условии, что ваш модал имеет контроллер nav)
    // Modal Dismiss iOS 13
    modalNavController.presentationController?.delegate = modalVc
  1. В контроллере модального представления добавьте следующий делегат + метод
// MARK: - iOS 13 Modal (Swipe to Dismiss)

extension ModalViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {

        print("slide to dismiss stopped")
    }
}
  1. В модальном View Controller убедитесь, что следующее свойство имеет значение true, чтобы метод делегата вызывался
.
    self.isModalInPresentation = true
  1. прибыль