首先,建议检查弹出窗口是否正在显示,这也可以方便地检查它是否已分配:
if ([self.popover isPopoverVisible]) {
[self.popover dismissPopoverAnimated:NO];
}
现在的问题是,你没有得到委托回调- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
如果您像这样以编程方式关闭弹出窗口,但您需要对弹出窗口的强引用,直到它不再可见。
执行此操作的方法是延迟将该属性设置为 nil,直到返回主运行循环,因为当您返回主运行循环时,所有动画都将完成,因此弹出窗口将不再可见。
您需要将设置弹出窗口为零的代码移动到另一个方法中:
- (void)releasePopover {
self.popover.delegate = nil;
self.popover = nil;
}
然后,在您的旋转回调中,添加此方法以在主运行循环上触发,我喜欢通过向主运行循环添加调用操作来执行此操作:
if ([self.popover isPopoverVisible]){
[self.popover dismissPopoverAnimated:NO];
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(releasePopover) object:nil];
[[NSOperationQueue mainQueue] addOperation:invocationOperation];
}
最后,为了清洁起见,您可能需要致电-releasePopover
从你的内心- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
打回来。
所以,把它们放在一起:
- (void)releasePopover
{
self.popover.delegate = nil;
self.popover = nil;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
if ([self.popover isPopoverVisible]){
[self.popover dismissPopoverAnimated:NO];
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(releasePopover) object:nil];
[[NSOperationQueue mainQueue] addOperation:invocationOperation];
}
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
[self releasePopover];
}
话虽如此,除非有充分的理由,否则您可能只想保留弹出窗口以供重用,并且仅在收到内存不足警告和/或视图被卸载时将其设置为 nil,正如 Chris Loonam 的回答所提到的那样