我最近重构了我的应用程序,以实现命令模式。为此,我试图将所有功能都放入适当的命令类中。除了一个例外,我已经为所有命令成功实现了模式。我有一个名为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.mapViewEngineself.mapViewEngine.mapVCUIViewController

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

那么,为什么同样的命令对我的命令类无效?它和mapViewEngine都是NSObject,所以我知道这不是问题。我想我可以使mapViewEnginemapVC成为委托,但是这样做的全部原因是为了使我的 class 脱钩。我整夜都在努力解决问题,因此我现在会接受任何想法或建议。

最佳答案

(在我之前的评论中建议)这是一个内存管理问题,正在触发委托回调,但是由于没有强大的指针支持,因此已经释放了委托对象。

正如DisableR指出的那样,委托连接并没有影响对象的保留计数(并且您没有像两年前那样遇到异常,因为委托没有被取消。)

关于ios - 为什么UIImagePickerControllerDelegate方法不触发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33447753/

10-10 01:40