我目前正在使用UIImagePicker,并且应用程序在iOS 8上使用以下工作流程崩溃:
启动相机,对其进行缩放以显示下面的缩放滑块,然后拍照。选择使用照片和应用崩溃。

在深入研究崩溃后,“ didHideZoomSlider”消息发送到图像选择器视图的已释放实例。

这是我的代码:

    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeImage, nil];
    imagePicker.allowsEditing = YES;
    imagePicker.delegate = self;
    [myController presentViewController:imagePicker animated:animated completion:nil];


我尝试了几件事。我的控制器对图像选择器有很强的引用,我尝试将其设为弱引用,但应用仍然崩溃。另外,我需要一个强有力的参考,因此我实际上不能使它变得脆弱。

尽管这看起来像是一个Apple错误,并且已经有人记录了该错误(http://openradar.appspot.com/18762927),但我还是想尝试一下他们正在使用的解决方法。但是,我无法通过UIImagePicker的实例访问“ CAMZoomSlider”。

有人知道如何前往CAMZoomSlider吗?

最佳答案

通过在子类UIImagePickerController类中执行以下操作,我能够清除CAZoomSlider委托。可以肯定的是,它似乎已解决了崩溃问题。

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self clearZoomSliderDelegate:self.view.subviews];
}

- (void)clearZoomSliderDelegate:(NSArray*)subviews
{
    for (UIView *subview in subviews)
    {
        if ([subview isKindOfClass:NSClassFromString(@"CAMZoomSlider")])
        {
            if ([subview respondsToSelector:@selector(setDelegate:)]) {
                [subview performSelector:@selector(setDelegate:) withObject:nil];
            }

            return;
        }
        else if (subview.subviews != nil) {
            [self clearZoomSliderDelegate:subview.subviews];
        }
    }
}

关于ios - 访问CAMZoomSlider实例以清除其委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27628302/

10-13 04:25