Отклонение от раскадровки, отклоненные методы делегата

У меня есть контроллер представления, который представлен в 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