Отклонение от раскадровки, отклоненные методы делегата
У меня есть контроллер представления, который представлен в popover с помощью раскладки.
![введите описание изображения здесь]()
В контроллере представления представления у меня был следующий код:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let svc = segue.destinationViewController as? SettingsViewController {
svc.popoverPresentationController?.delegate = self
}
}
Однако оказывается, что представленный контроллер представлений, хотя он выглядит как popover, имеет modalPresentationStyle
of '.Modal
и, следовательно, a nil
popoverPresentationController
. Weird!
Итак, я обновил код следующим образом:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let svc = segue.destinationViewController as? SettingsViewController {
svc.modalPresentationStyle = .Popover
svc.popoverPresentationController?.delegate = self
}
}
Теперь делегат svc.popoverPresentationController
настроен в порядке, но если popover отклоняется пользователем, выстукивающим снаружи, ни один из методов делегата UIPopoverPresentationControllerDelegate
(например, popoverPresentationControllerShouldDismissPopover
не вызван. Что мне не хватает?
Ответы
Ответ 1
Не нужно делегировать в этом случае. Если presentingViewController
(любой vc
содержит popover) просто переопределяет:
override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
// Before calling super get a handle on which controller is being dismissed
print("Dismiss: \(self.presentedViewController)")
super.dismissViewControllerAnimated(flag, completion: completion)
}
Вы получите уведомление независимо от того, как оно будет отклонено. Вам также не нужно устанавливать какие-либо дополнительные переменные/настройки в prepareForSegue:
(по крайней мере, для обработки этого взаимодействия).
Ответ 2
В этом же выпуске, и после прочтения документации я понял, что вам нужно позвонить:
[self presentViewController:myPopoverViewController animated: YES completion: nil];
чтобы методы делегата вызывались.
Полный фрагмент выглядит следующим образом и выполняется в моем - (void) prepareForSegue: метод отправителя:
// Present the view controller using the popover style.
myPopoverViewController.modalPresentationStyle = UIModalPresentationPopover;
[self presentViewController:myPopoverViewController animated: YES completion: nil];
// Get the popover presentation controller and configure it.
UIPopoverPresentationController *presentationController =
[myPopoverViewController popoverPresentationController];
presentationController.permittedArrowDirections =
UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight;
presentationController.sourceView = myView;
presentationController.sourceRect = sourceRect;
https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller