Отключить пользовательский всплывающий диалог - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужно отключить модальные диалоги при нажатии за пределами его области.Это работает автоматически, когда представление определено в раскадровке и представлено так:

let storyboard = UIStoryboard(name: "Services", bundle: nil)
let pinCodeController = storyboard.instantiateViewController(withIdentifier: "PinCodeController")

pinCodeController.modalPresentationStyle = .popover
pinCodeController.preferredContentSize = CGSize(width: 200, height: 300)

let presentationController = pinCodeController.popoverPresentationController
presentationController?.sourceView = pinCodeButton

self.present(pinCodeController, animated: true)

Однако, поскольку я не использую раскадровки, у меня почти такой же код для представления моего представления.Этот код представляет представление, но он не отклоняется при нажатии за пределами его границы.

popoverFromSourceController.modalPresentationStyle = .popover
popoverFromSourceController.preferredContentSize = CGSize(width: 200, height: 300)

let presentationController = popoverFromSourceController.popoverPresentationController
presentationController?.sourceView = self.popoverFromSourceViewButton

present(popoverFromSourceController, animated: true)

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

У меня та же проблема, но несколько отличающаяся при представлении этого самого всплывающего окна из UIBarButtonItem.Мой навигационный контроллер имеет две кнопки, и когда диалоговое окно отображается с помощью первой кнопки, оно автоматически закрывается при нажатии на вторую кнопку.Но нажатие на главном экране не закрывает диалоговое окно.

Полный исходный код: https://github.com/igunther/CleanController

Кто-нибудь?

Обновление

Добавлен этот код, но все еще не работает:

popoverFromSourceController.isModalInPopover = false

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

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

0 голосов
/ 23 апреля 2019

Мне было интересно - вы пытались реализовать поведение с помощью UITapGestureRecognizer?

Например:

func viewDidLoad() {
  let dismissTapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissPopover(_:)))

  view.addGestureRecognizer(dismissTapGesture)
}


// This is invoked if the user taps anywhere outside the modal bounds. 

@objc func dismissPopover(_ sender: UITapGestureRecognizer) {
  if sender.state == UIGestureRecognizerState.Ended {
      let point = sender.location(in: view)

      if !self.view.frame.contains(point) {
          // We have tapped outside the popover
      }
  }
}

Я не тестировал этот код, но он должен работать правильно.В качестве альтернативы, вместо добавления распознавателя жестов в представлении popover, попробуйте добавить его в VC, который представляет popover.Надеюсь, это поможет!

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