在第二次显示弹出控制器时(在解除然后重新显示它之后),我收到以下错误:
由于未捕获的异常'NSGenericException'而终止应用程序,原因:' - [UIPopoverController dealloc]到达,而popover仍然可见。'
堆栈跟踪只是一堆十六进制,每次都会在UIApplicationMain上发生SIGABRT。这是按钮触发的代码:
- (IBAction)createNewScore:(id)sender {
if (self.pc)
if (self.pc.popoverVisible)
return;
else
// Breakpoint is hit here—crashes after this line
[self.pc presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
NGDocumentInfoViewController *documentInfoVC = [[NGDocumentInfoViewController alloc] initWithBlankDocumentTargetInManagedObjectContext:self.context];
UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:documentInfoVC];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneCreatingNewScore:)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCreatingNewScore:)];
navc.navigationBar.topItem.leftBarButtonItem = doneButton;
navc.navigationBar.topItem.rightBarButtonItem = cancelButton;
CGSize popoverSize = CGSizeMake(documentInfoVC.view.bounds.size.width, documentInfoVC.view.bounds.size.height);
documentInfoVC.contentSizeForViewInPopover = popoverSize;
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navc];
popover.delegate = self;
self.pc = popover;
[popover presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
我想保留修复问题的popover,但这是一个ARC环境,所以我没有保留。有没有办法让我修复错误(不关闭文件的ARC并且必须手动为整个文件做内存)?
编辑:弹出窗口存储为ivar:
@property (strong) UIPopoverController *pc;
有没有人有这个问题的解决方案(可能是ARC覆盖)?我将提交BR作为CodaFi建议,但解决方案仍然会很好,因为这是一个重大项目的障碍。如果这是不可能的,那么我想我会自己动手。
答案 0 :(得分:18)
我遇到了同样的问题并通过将popover控制器保留在强实例变量中来修复它,并且在重置属性之前显式解除它,然后在第二次操作中分配了新的popover控制器。在您的示例中,您应该添加如下内容:
- (IBAction)createNewScore:(id)sender {
if (self.pc) {
[self.pc dismissPopoverAnimated:YES];
}
答案 1 :(得分:3)
如果您的popover存储为强引用,则无法取消分配。可以解除分配的唯一可能性是在包含强引用(在您的示例中为self
)的对象也被释放的情况下。
我认为重要的问题是当弹出窗口可见时你对你的观点做了什么。
如果你已经检查了这个,那么它必须是一个框架错误。