2016-01-26 7 views
16

У меня есть контроллер вида, который представлен в popover с помощью раскадровки segue.Storyboard popover уволен, методы делегата не называются

enter image description here

В контроллере представления представления, я имел следующий код:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let svc = segue.destinationViewController as? SettingsViewController { 
     svc.popoverPresentationController?.delegate = self 
    } 
} 

Однако, оказывается, что представленный контроллер представления, несмотря на то, что выглядит как пирог, имеет modalPresentationStyle от '.Modal и, следовательно, nilpopoverPresentationController. Weird!

Итак, я обновил код следующим образом:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let svc = segue.destinationViewController as? SettingsViewController { 
     svc.modalPresentationStyle = .Popover 
     svc.popoverPresentationController?.delegate = self 
    } 
} 

svc.popoverPresentationController Делегат теперь устанавливается в порядке, но если поповер освобождается пользователем не коснувшись снаружи, ни один из методов UIPopoverPresentationControllerDelegate делегата (например, popoverPresentationControllerShouldDismissPopover являются .?. называется Что я упускаю

+0

Возможно глупый вопрос, вы уверены, что переход установлен как «Present как Поповер "в раскадровке? –

+0

Да, определенно - и он корректно представляет собой popover (и даже до установки 'svc.modalPresentationStyle = .Popover'). Стоит проверить, хотя! –

+0

Одна вещь странная, она должна сказать «Present as Popover», так как просто «Popover» должен быть устаревшим, но я не думаю, что это проблема ... –

ответ

7

Нет необходимости для делегирования в этом случае Если presentingViewController (независимо от vc находится содержащий поповер) просто переопределяет:

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: (по крайней мере, для обработки этого взаимодействия).

+0

Это единственный ответ, так что получите награду. Не кажется правильным, хотя, как-то –

+0

@AshleyMills любопытно, почему вы так не считаете? С переходом к пополнениям, предупреждениям и листам действий, являющимся фактическими контейнерами (начиная с iOS 8), в отличие от их собственных независимых элементов представления (например, окон), на самом деле это действительно имеет смысл. Теперь popover функционирует так же, как обычный VC. – Firo

+0

Извините, не в том смысле, что ваш был плохим ответом.Просто я надеялся, что кто-то узнает, почему методы popoverPresentationControllerDelegate не запускались. И в моем случае popover представлен с помощью UIBarButtonItem в навигационной панели, поэтому navController нуждается в подклассе для реализации вашего решения –

0

Ран в тот же вопрос и после прочтения документации, я понял, что вам нужно позвонить:

[self presentViewController:myPopoverViewController animated: YES completion: nil];

для того, чтобы методы делегата получить колл.

Полный фрагмент кода выглядит следующим образом и запускается в моей - (Недействительными) 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

 Смежные вопросы

  • Нет связанных вопросов^_^