为什么UIImagePickerControllerDelegate方法没有触发?

时间:2015-10-31 03:27:17

标签: ios objective-c delegates

我最近重构了我的应用以实现命令模式。为此,我试图将所有功能都插入到适当的命令类中。我已成功实现了所有命令的模式,但有一个例外。我有一个名为HarvestPhotoCommand的命令,它启动UIImagePickerController,我想使用该命令类作为选择器的委托。看起来很简单,但由于某种原因,没有调用委托方法。

这是我的代码:

//Header file
    @interface WSHarvestPhotoCommand : WSCommand
    <
        UINavigationControllerDelegate,
        UIImagePickerControllerDelegate,
        MWPhotoBrowserDelegate
    >
    @end

//From the super class header file:
@property (nonatomic, weak) WSMapViewEngine *mapViewEngine;

//Implementation file
-(void)execute
{
    _imagePicker = [[UIImagePickerController alloc] init];
    _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    _imagePicker.delegate = self;
    _imagePicker.navigationBar.barStyle = [WSAppSettings sharedSettings].theme.barStyle;
    [self.mapViewEngine.mapVC presentViewController:_imagePicker animated:YES completion:nil];
}

#pragma mark - UIImagePickerControllerDelegate
#pragma mark -
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSLog(@"Please hit me!");
}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    NSLog(@"Or me!");
}

WSCommandNSObjectself.mapViewEngine也是self.mapViewEngine.mapVCUIViewControllermapViewEngine

到目前为止,我尝试过两次实验。首先,我在mapVC上设置委托协议,并将其作为委托;第二,我为UIImagePicker做了同样的事情。这两个实验都有效,这意味着在每个类中都调用了委托方法。这证明我的mapViewEngine实现是正确的。

那么为什么同样的命令类不起作用呢?它和mapViewEngine都是NSObject,所以我知道这不是问题所在。我想我可以让mapVC_users代表,但我这样做的全部原因是要解除我的课程。我整晚都试图解决这个问题,所以此时我会接受任何想法或建议。

2 个答案:

答案 0 :(得分:2)

如果您使用ARC,则delegate的{​​{1}}应为UIImagePickerController。这意味着在weak死亡UIImagePickerControllerDelegate的对象后,delegate的值自动变为UIImagePickerController。 在nil上进行任何点击之前,您的WSHarvestPhotoCommand对象会在内存中消失。

答案 1 :(得分:1)

这(在我之前的评论中提出)是一个内存管理问题,委托回调被解雇但是已经被委托的对象已经被释放,因为它没有强指针支持。

由于DisableR指出委托连接没有影响对象保留计数(并且你没有像两年前那样得到一个例外,因为委托已经没有了......)