我向你保证,我确实为我的问题寻找答案,但没有一个是有帮助的。在这里,我得到了一个简单的代码,可以在UIImagePickerController
中显示UIPopoverController
:
-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc]
initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:NO];
}
现在,即使从我第一次到达[UIPopoveController dealloc]
时...错误和程序崩溃。根据ARC,我没有做任何保留,重新发布或自动释放。在受益于ARC时,UIPopoverControllers
是否有任何特殊考虑?
答案 0 :(得分:203)
UIPopoverControllers应始终保存在实例变量中。为它创造一个强大的财产是一个很好的做法。
<强>更新强>
从iOS 8开始,您应该使用UIPopoverPresentationController
。然后你不需要保留对popover的引用,因为它是由表示控制器管理的。
代码示例(适用于iPhone和iPad):
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];
答案 1 :(得分:11)
当函数退出时,没有其他对popover控制器的引用,所以它太早解除分配。
尝试将其添加为您班级的成员。
添
答案 2 :(得分:10)
添加@ phix23回答的内容,创建* poc属性,如下所示:
@property (nonatomic, retain) IBOutlet UIPopoverController *poc;
然后更改
UIPopoverController *poc = [[UIPopoverController alloc]
initWithContentViewController:picker];
的
self.poc = [[UIPopoverController alloc]
initWithContentViewController:picker];