Делегат UIPopoverController не получает приглашение на увольнение

Я назначаю объект popover o contentViewController, и я помещаю код отклонения в кнопку, которая находится в контроллере представления содержимого.

При нажатии кнопки:

 [self.popover dismissPopoverAnimated:YES];

вызывается и popover отклоняется. Однако метод делегата не вызывается автоматически. Я думал, что я не назначаю его делегатом, но он есть. Если я добавлю следующую строку после строки offsetPopoverAnimated, делегат будет вызван правильно...

 [self.popover.delegate popoverControllerDidDismissPopover:self.popover];

Я не понимаю, почему он не "автоматически" вызывает метод делегата. Как это может случиться?

Ответ 1

popoverControllerDidDismissPopover: в делегате не вызывается, когда используется 'rejectPopoverAnimated:'.

Из Apple Documentation для popoverControllerDidDismissPopover: в UIPopoverControllerDelegate:

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

Ответ 2

Есть два способа отклонить popover. (а) выстукивание снаружи попперса; и (б) делать это программно с помощью

[self.popover dismissPopoverAnimated:YES];

Если вы делаете это программно, то документы (https://developer.apple.com/library/ios/documentation/uikit/reference/UIPopoverControllerDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIPopoverControllerDelegate/popoverControllerDidDismissPopover:) говорят:

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

Таким образом, не вызывать делегат автоматически - это нормальное поведение, и то, что вы делаете (называя его самостоятельно), прекрасно.