UIImagePickerController аварийно завершает работу при использовании PhotoLibrary в качестве источника

Я использую xcode 5.1 и тестировал код как на ios7.1, так и на 7.0.2. Приложение аварийно завершает работу с UIImagePickerController в двух случаях на устройстве:

1) когда для allowsEditing установлено значение YES, после того, как я обрезаю изображение и нажимаю «Выбрать», как только оно возвращается к моему собственному виду, приложение вылетает

2) внутри UIImagePickerController, когда я возвращаюсь из списка фотографий в список альбомов, и я был внизу списка фотографий, он вылетает (независимо от того, allowsEditing ДА или нет). Обратите внимание, что он не падает, если я прокрутил список фотографий вверх.

Вот мой код:

- (IBAction)photoPickPressed:(id)sender {

    if ([self isPhotoLibraryAvailable]) {

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

#pragma mark - image picker delegates
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [picker dismissViewControllerAnimated:YES completion:^(){
        NSLog(@"finished image picking");
    });
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

Сообщение о сбое

* Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "* -[NSProxy doNotRecognizeSelector:scrollViewDidScroll:] вызывается!"

Примечание: НЕ происходит сбой, если я использую камеру, даже если я установил allowsEditing на YES. Также он ТОЛЬКО вылетает на реальных устройствах, а не в симуляторе.

Просто чтобы уточнить (возможно, не связанный), изначально я объявил imagePicker как

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

, и он разбился. Поэтому я много гуглил, и в сообщении говорится, что контроллер может быть переработан, и предлагается объявить его в определении класса. Итак, теперь я объявил это в своем объявлении класса:

@property (strong, nonatomic) UIImagePickerController *imagePicker;

Заранее спасибо.

Обновление: я попытался даже поместить вызов imagePickerController в корневое представление моего приложения, и оно все равно вылетает с тем же сообщением. У меня еще не должно быть загружено прокручиваемое представление.


person Jiaqi    schedule 21.03.2014    source источник
comment
Странно то, что вместо реального объекта используется прокси объекта. Я думаю, что NSProxy используется вместо UIImagePickerController, и поэтому, когда он получает сообщение scrollViewDidScroll, он не может его обработать. Вероятно, это просто побочный продукт более крупной и очевидной проблемы.   -  person Infinity James    schedule 21.03.2014
comment
Спасибо, Джеймс! С вашей подсказкой я попытался создать еще один новый проект, и приведенный выше код действительно работает без проблем. Так что, видимо, что-то не так с другими местами в моем исходном приложении. Есть ли какой-нибудь намек на то, с чего мне следует начать расследование оригинального приложения?   -  person Jiaqi    schedule 21.03.2014


Ответы (2)


После нескольких часов исследования и проб я подтвердил, что это вызвано сторонней структурой, интегрированной в приложение: даже это пустое приложение аварийно завершает работу с UIImagePickerController, если я связываю эту структуру там.

Спасибо вам за помощь!

person Jiaqi    schedule 21.03.2014
comment
Не могли бы вы сообщить нам, что это был за фреймворк? У меня такая же проблема. - person iMack; 27.04.2014
comment
Да, я тоже этим пользовался, а потом он просто случайно пропал. - person iMack; 28.04.2014
comment
@Jiaqi Как вы выяснили, что это за фреймворк? Я не использую эту структуру, но я получаю тот же сбой - person Dan F; 07.02.2015
comment
@DanF Я пробовал грубой силой ... В основном из библиотек, с которыми я был наиболее незнаком ... Извините, это может быть не так уж полезно. - person Jiaqi; 08.02.2015

Я бы порекомендовал удалить метод imagePickerController: didFinishPickingMediaWithInfo:. Это совершенно необязательно и по умолчанию закроет средство выбора изображений.

Кроме этого, я бы рекомендовал:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [self dismissViewControllerAnimated:YES completion:nil];
}

Согласно документации, этот метод должен вызываться на представленном контроллере представления:

Контроллер представления представления отвечает за отклонение представленного им контроллера представления. Если вы вызываете этот метод на самом представленном контроллере представления, он автоматически перенаправляет сообщение на представляющий контроллер представления.

person Infinity James    schedule 21.03.2014
comment
Спасибо за ответ, Джеймс. Но я должен использовать imagePickerController: didFinishPickingMediaWithInfo: для хранения выбранного изображения. Я просто упростил код здесь до NSLog (но сбой все равно произойдет). Что касается второго, разве это не отклонит мою собственную точку зрения вместо представленной imagePickerController? - person Jiaqi; 21.03.2014
comment
Как насчет ссылки или цитаты о том, почему didFinishPickingMediaWithInfo не нужен, если вам нужно результирующее изображение? - person Dan F; 06.02.2015