我为 PopoverController 创建了自己的类(没有子类化 UIPopoverController)以按照我想要的方式呈现 ViewController。
CustomPopoverController 不是 UIViewController,而是有一个名为“contentViewController”的 ivar,它是实际显示的 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... 方法链以及它们应该何时被调用。
最佳答案
当您通过 UIView 的方法添加 subview 或删除 subview 时,它永远不会导致拥有的 UIViewController
调用 viewWillAppear
、 viewDidAppear
、 viewWillDisappear
和 viewDidDisapper
。只有那些由 UINavigationController
方法管理的 viewController ,如 pushViewController:animated:
或 popViewControllerAnimated:
,或 presentModelViewController:aniamted:
...等。他们会通知 Controller View 的状态正在改变。