#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. Это довольно удобно с меткой времени, но ваш метод обратного вызова на самом деле устарел. Похоже, что мое приложение даже не выполняет обратный вызов, так как выдает ошибку при сборке своих аргументов. Спасибо за ваш быстрый ответ, хотя 🙂