当我第二次显示一个弹出控制器(在关闭它后再重新显示)时,我遇到了以下错误:
Terminating app due to uncaught exception 'NSGenericException', reason: '-[UIPopoverController dealloc] reached while popover is still visible.'
堆栈跟踪只是一堆十六进制数,在每次 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环境,所以我没有retain。有没有办法可以修复这个错误(而不是为该文件关闭ARC并手动处理整个文件的内存)?编辑:popover存储为ivar:
@property (strong) UIPopoverController *pc;
有没有人有解决这个问题的方案(或许是ARC override)?如CodaFi所建议,我会提交BR,但如果能提供一个解决方案就更好了,因为这是重大项目中的障碍。如果不可能,那我想我会自己动手解决。
-[UIPopoverController dealloc]
的符号断点,并查看调试器中它停在哪里?也许那里的堆栈跟踪可以提供一些关于是什么释放了你的弹出窗口的见解。 - Brad LarsoncreateNewScore
是否在主线程上执行? - titaniumdecoy