正在关闭 Popover,[UIPopoverController dealloc] 在弹出窗口仍然可见时达到

2024-03-12

我有一个 UIPopoverController 存储在我的视图控制器的一个强属性中。当用户在弹出窗口可见时旋转 iPad 时,我会关闭弹出窗口并将属性设置为 nil。

if (self.popover != nil) {
    [self.popover dismissPopoverAnimated:NO];
    self.popover.delegate = nil;
    self.popover = nil;
}

当代码到达 self.popover = nil 时,ARC 尝试释放 UIPopoverController,但它崩溃了,因为它应该仍然可见。

我该如何在不崩溃的情况下关闭并消除弹出窗口?


首先,建议检查弹出窗口是否正在显示,这也可以方便地检查它是否已分配:

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 的回答所提到的那样

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正在关闭 Popover,[UIPopoverController dealloc] 在弹出窗口仍然可见时达到 的相关文章

随机推荐