Приложение отключает sim-карту iPhone при выборе из библиотеки фотографий

#iphone #ios

#iPhone #iOS

Вопрос:

Я пытаюсь использовать UIImagePickerController для выбора фотографии из библиотеки фотографий ( UIImagePickerControllerSourceTypePhotoLibrary ). Моя проблема в том, что когда я выбираю фотографию, приложение немедленно вылетает. Из приведенной ниже ошибки его попытка вставить nil в NSDictionary which возвращает фотографию.

Не могу понять, почему, хоть убей. Я видел много отчетов о сбоях, касающихся UIImagePickerController, но ни один из них не решает эту проблему. Есть идеи?

Ниже приведен вывод на консоль, а дальше — мой код.

 2011-10-31 12:29:27.195 LognLoad[49923:7703] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: UIImagePickerControllerOriginalImage)'
*** Call stack at first throw:
(
0   CoreFoundation                      0x02392c99 __exceptionPreprocess   185
1   libobjc.A.dylib                     0x024e05de objc_exception_throw   47
2   CoreFoundation                      0x0234b3f8  [NSException raise:format:arguments:]   136
3   CoreFoundation                      0x0234b36a  [NSException raise:format:]   58
4   CoreFoundation                      0x02391505 -[__NSCFDictionary setObject:forKey:]   293
5   PhotoLibrary                        0x0b47414e __PLNotifyImagePickerOfImageAvailability_block_invoke_1   161
6   PhotoLibrary                        0x0b515ac1 __-[PLAssetsSaver requestImageFromAsset:withFormat:completionBlock:synchronous:]_block_invoke_1   45
7   MediaPlayer                         0x0b9e7141 PUTReceivedImageFromAssetURL   169
8   MediaPlayer                         0x0b9e88c7 do_ReturnImageDataForAssetURL   225
9   MediaPlayer                         0x0b9e8c4e _XReturnImageDataForAssetURL   435
10  MediaPlayer                         0x0b9e8a64 PersistentURLTranslatorClient_server   125
11  libSystem.B.dylib                   0x972d06fb dispatch_mig_server   232
12  MediaPlayer                         0x0b9e871d __getClientMIGMux_block_invoke_1   45
13  libSystem.B.dylib                   0x972aa498 _dispatch_source_latch_and_call   62
14  libSystem.B.dylib                   0x9729d3d2 _dispatch_source_invoke   210
15  libSystem.B.dylib                   0x9729bf59 _dispatch_queue_invoke   163
16  libSystem.B.dylib                   0x9729c495 _dispatch_queue_drain   258
17  libSystem.B.dylib                   0x9729bee8 _dispatch_queue_invoke   50
18  libSystem.B.dylib                   0x9729bcfe _dispatch_worker_thread2   240
19  libSystem.B.dylib                   0x9729b781 _pthread_wqthread   390
20  libSystem.B.dylib                   0x9729b5c6 start_wqthread   30
)terminate called after throwing an instance of 'NSException'
 

Здесь я включаю средство выбора изображений:

 - (IBAction)getImage
{
// Create image picker controller

self.imgPicker = [[UIImagePickerController alloc] init];
self.imgPicker.delegate = self;
self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:self.imgPicker animated:YES];

}
 

и вот обратный вызов для выбора изображения:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
self.photo = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
 

Комментарии:

1. Вероятно, библиотека фотографий на вашем симуляторе повреждена. Попробуйте сбросить содержимое и настройки на симуляторе iPhone.

2. Я думаю, ты прав, сгоша. Я только что добавил свою собственную фотографию через приложение Safari, и она мне понравилась. Спасибо за предложение!

Ответ №1:

Попробуйте это, у меня это работает.

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];
    NSString *hour = [components hour] < 10 ? [NSString stringWithFormat:@"0%i", [components hour]] : [NSString stringWithFormat:@"%i", [components hour]];
    NSString *minute = [components minute] < 10 ? [NSString stringWithFormat:@"0%i", [components minute]] : [NSString stringWithFormat:@"%i", [components minute]];
    NSString *second = [components second] < 10 ? [NSString stringWithFormat:@"0%i", [components second]] : [NSString stringWithFormat:@"%i", [components second]];
    NSString *day = [components day] < 10 ? [NSString stringWithFormat:@"0%i", [components day]] : [NSString stringWithFormat:@"%i", [components day]];
    NSString *month = [components month] < 10 ? [NSString stringWithFormat:@"0%i", [components month]] : [NSString stringWithFormat:@"%i", [components month]];
    NSString *year = [NSString stringWithFormat:@"%i", [components year]];
    NSString *fileName = [NSString stringWithFormat:@"%@_%@_%@_%@_%@_%@.png", day, month, year, hour, minute, second];
    NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@", fileName]];
    [UIImagePNGRepresentation(img) writeToFile:pngPath atomically:YES];

    if ([picker sourceType] == UIImagePickerControllerSourceTypeCamera)
        UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
 

Я использовал как для фотоальбома, так и для камеры; он сохраняет изображение с какой-то меткой времени.

Надеюсь, это поможет вам.

Комментарии:

1. Это довольно удобно с меткой времени, но ваш метод обратного вызова на самом деле устарел. Похоже, что мое приложение даже не выполняет обратный вызов, так как выдает ошибку при сборке своих аргументов. Спасибо за ваш быстрый ответ, хотя 🙂