Представление поповера без перехода - Popover по-прежнему на весь экран - PullRequest
0 голосов
/ 18 января 2020

У меня есть UIViewController с кнопкой в ​​нем, которую я сделал программно (давайте просто назовем это MyViewController). Я пытаюсь представить поповер, когда кнопка нажата. Давайте назовем поповерный DestinationViewController. При нажатии кнопки будет вызываться следующая функция:

func buttonAction(_ button: UIView) {
   var popover = storyboard?.instantiateViewController(withIdentifier: "destinationVC") as? DestinationViewController
   popover?.popoverPresentationController?.delegate = self
   popover?.modalPresentationStyle = .popover
   popover?.popoverPresentationController?.sourceView = button
   //popover?.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: 50, height: 50)
   popover?.preferredContentSize = CGSize(width: 200, height: 100)

   present(popover!, animated: true, completion: nil)         
}

(я закомментировал строку sourceRect, потому что она ничего не делала, но я не знаю, правильно ли я ее использую.)

Кроме того, я убедился, что MyViewController соответствует протоколу UIPopoverPresentationControllerDelegate. Поэтому MyViewController реализует функцию:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
   return .none
}

Наконец, в моей раскадровке для DestinationViewController я установил флажок «Использовать предпочтительный явный размер» с шириной 200 и высотой 100.

Однако, мой DestinationViewController по-прежнему отображается в полноэкранном режиме. Я читал, что функция adaptivePresentationStyle должна предотвратить это, но не повезло. Я знаю, что использование segue заставит его работать правильно, но я не могу сделать переход в раскадровке, потому что моя кнопка была сделана программно.

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

1 Ответ

0 голосов
/ 18 января 2020

Вам необходимо установить modalPresentationStyle на .popover до того, как вы получите доступ к свойству popoverPresentAtionController:

Из документации :

Если вы создали контроллер представления, но еще не представили его, доступ к этому свойству создает контроллер представления всплывающего окна, когда значением в свойстве modalPresentationStyle является UIModalPresentationStyle.popover. Если стиль модального представления имеет другое значение, это свойство равно nil.

Поскольку вы не установили стиль модального представления до установки делегата, контроллер представления всплывающего окна не создается. Контроллер popover будет создан, когда вы установите .sourceView, поскольку стиль представления теперь .popover, но делегат не будет установлен в этом экземпляре.

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

...