2010-08-25 3 views
14

У меня есть UIPopoverController с собой как делегат: Я получаю вызовы, когда я выхожу за пределы контроллера popover, но когда я нажимаю внутрь, я тоже хочу уволить, поэтому я использую -dismissPopoverAnimated: но делегат не вызывается в этом случае. Это нормально? Это ошибка, или я делаю что-то неправильно?Увольнение UIPopoverController с -dismissPopoverAnimated: не вызовет делегата?

newDocPopoverController = [[UIPopoverController alloc] initWithContentViewController:vc]; 
[newDocPopoverController setPopoverContentSize:CGSizeMake(240, 44*4)]; 
[newDocPopoverController presentPopoverFromBarButtonItem:sender 
       permittedArrowDirections:UIPopoverArrowDirectionAny 
                 animated:YES]; 
[newDocPopoverController setDelegate:self]; 

UPDATE:

Ах, независимо от происхождения проблемы (ли это ошибка или это предполагаемое поведение) вызов делегата по себе решает проблему :)

Когда contentViewController-х я коснулся меня. Я позвоню родительскому делегату UIPopoverController.

if ([parentPopoverController.delegate popoverControllerShouldDismissPopover:parentPopoverController]){ 
    [parentPopoverController dismissPopoverAnimated:YES]; 
    [parentPopoverController.delegate popoverControllerDidDismissPopover:parentPopoverController]; 
}r]; 
+0

Я только что наткнулся на ту же «проблему», спасибо за указание, как ее исправить; то есть. отпустите диспетчер popover, затем вызовите метод делегата. – Jack

ответ

22

Это нормально, ожидается поведение.

Цитируя Apple docs на popoverControllerDidDismissPopover::

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

+0

Спасибо !, I c. Я думаю, что информация также должна появиться в ссылке на класс UIPopoverController, а также не только в ее ссылке на протокол делегатов. ;) – nacho4d

22

Программного popoverControllerDidDismissPopover не дозвонился и не будет уволен, вы должны будете вызывать делегат себя:

[self.PopUp dismissPopoverAnimated:YES]; 
[self.PopUp.delegate popoverControllerDidDismissPopover:self.PopUp]; 

Где PopUp является родительским UIPopoverController

Надеется, что это помогает

Cheers Al

+0

это работает, к сожалению, это очень неинтуитивно. В отличие от других моделей, которые используют анимацию. Например, если вы отпустите представление в анимации, оно сломает приложение, вместо этого здесь, если вы выпустите popover в popoverControllerDidDismissPopover, он будет работать отлично. –

0

сначала установите делегат;

yourPopup.delegate = self;

, а затем где-то в вашем коде (может быть в частности метод вызова из-за какого-либо события). используйте следующий код;

[self.yourPopUp rejectPopoverAnimated: YES];