使用UIImageView控制器选择图像后iPhone后退按钮拒绝工作?

时间:2013-05-24 02:37:37

标签: objective-c ipad cocoa-touch uiimagepickercontroller

所以我正在编写这个从主屏幕开始的iPad应用程序,然后从那里你可以进入设置页面。在设置页面中,您可以使用弹出视图中的UIImagePickerController从相册中选择图片。

如果我转到设置页面,然后按后退按钮返回主页,一切都按预期工作。但如果我去设置并选择图像,页面上的后退按钮将不允许我返回主页面。

popover和UIImagePickerController似乎工作正常,所以我不知道是什么导致了这一点。这是UIImagePickerController的代码。

- (IBAction)imagePick1:(id)sender {
    pickerController = [[UIImagePickerController alloc] init];
    [pickerController setDelegate:self];
    [pickerController setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
    [pickerController setAllowsEditing:NO];

    popoverController = [[UIPopoverController alloc] initWithContentViewController:pickerController];
    [popoverController setDelegate:self];
    [popoverController presentPopoverFromRect:[[self imageButton1] frame] inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

...

- (void)imagePickerController:(UIImagePickerController *)pickerController1 didFinishPickingMediaWithInfo:(NSDictionary *)info

{
    image1 = [info objectForKey:UIImagePickerControllerOriginalImage];      
    _image1.image = image1;

    [popoverController dismissPopoverAnimated:YES];
}

当我尝试按后退按钮时,应用程序会冻结,并且不会再响应任何其他命令。我做错了什么?

编辑:我再次运行它,这是我按下后退按钮时在日志中出现的错误。

-[__NSCFType dismissPopoverAnimated:]: unrecognized selector sent to instance 0x7128cd0

此处是我头文件的开头。

@interface ViewController : UIViewController
<UIPickerViewDataSource, UIPickerViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverControllerDelegate>{
    UIPopoverController *popoverController;
}
@property (nonatomic, retain) UIPopoverController *popoverController; 

1 个答案:

答案 0 :(得分:0)

可能重复。见here

您是否已在头文件中声明了委托,如下所示?还请确保您的代理也符合UINavigationControllerDelegate,因为UIImagePickerControllerDelegate直接继承自UINavigationControllerDelegate,但是所有UINavigationControllerDelegate方法都是可选的。

@interface MyViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

编辑:根据您的编辑,您似乎还需要将“UIPopoverControllerDelegate”添加到头文件中。您还需要在分配后添加[popoverController setDelegate:self]

编辑2:好了,现在你需要在你的实现(.m)文件中声明这个方法。

并返回是。

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {
    return YES;
}

编辑3:为什么你将dismissPopoverAnimated设置为NO并在它仍然显示时释放popoverController?

[popoverController dismissPopoverAnimated:NO];
[popoverController release];

尝试将dismissPopoverAnimated设置为YES并暂时删除该版本。顺便说一句,popoverController是否保留为头文件中的属性?你在用ARC吗?如果你使用ARC,你不应该在popoverController上调用release。

编辑4:

尝试将标题修改为:

UIPopoverController *_popoverController;

@property (nonatomic, retain) UIPopoverController *popoverController

并将@synthesize popoverController = _popoverController;添加到您的实施文件中。

现在开始用实现文件中的“_popoverController”替换“popoverController”的所有实例。

同时用{/ p>替换[popoverController dismissPopoverAnimated:YES];

if(_popoverController != nil)
    [_popoverController dismissPopoverAnimated:YES];

让我知道下面的结果。