Я создал свой собственный класс для PopoverController (без создания подкласса UIPopoverController) для представления ViewController так, как я хочу.
CustomPopoverController НЕ является UIViewController, вместо этого в нем есть ивар, называемый "contentViewController", который представляет собой VC, которыйна самом деле будет отображаться.
Я реализовал свой собственный "dismissPopoverAnimated:", чтобы отклонить мой пользовательский всплывающее окно, когда пользователь нажимает в любом месте за пределами кадра contentViewController:
-(void) dismissPopoverAnimated : (BOOL) animated
{
// dismissalView is the view that intercept the taps outside.
[self.dismissalView removeFromSuperview];
self.dismissalView = nil;
if (animated)
{
CGRect newFrame = self.view.frame;
// When in landscape Mode the width of the screen is actually the "height"
newFrame.origin.y = [UIScreen mainScreen].bounds.size.width;
[UIView animateWithDuration:0.5
animations:^{self.view.frame = newFrame;}
completion: ^(BOOL finished) {if(finished) [self.contentViewController.view removeFromSuperview];}];
}
else
{
[self.contentViewController.view removeFromSuperview];
}
isPresented = NO;
[self.delegate customPopoverDidDismissPopover:self];
}
Проблема в том, что даже еслиremoveFromSuperView
вызывается в любом случае - анимированный или нет, contentViewController
никогда не получает viewWillDisappear
, viewDidDisappear
или даже viewDidUnload
, когда я выпускаю contentViewController
;
У кого-нибудь есть идеи, почему?Или даже лучше пролить свет на цепочку метода viewWill ... / viewDid ... и когда они должны быть вызваны.