#iphone #objective-c #ios #uiimagepickercontroller #viewdidload
#iPhone #objective-c #iOS #uiimagepickercontroller #viewdidload
Вопрос:
На мой взгляд, у меня есть несколько полей, некоторые из них скрыты.
Существует segmentController с опцией 2.
Чтобы включить кнопку «сделать снимок», она должна быть включена 1
.
Итак, я заполняю поля, которые я вижу, нажимаю segmentedController на 1
позицию, заполняю другое поле, которое было скрыто, и делаю снимок.
Когда я вернулся из режима просмотра фотографий, все поля пусты, а селектор отменен ( setSelectedSegmentIndex:-1
).
Если я снова нажму этот переключатель в 1
положение, скрытое поле будет пустым, но UIImageView покажет сделанную мной фотографию…
если я установил viewDidLoad setSelectedSegmentIndex:1
, когда я закрываю PhotoView, все поля отображаются пустыми (снова UIImageView показывает изображение).
Я также попытался сохранить содержимое каждого поля в переменных и таким образом поместить все обратно в viewDidLoad
if (([name length] != 0) || ([price length] != 0) || (category length] != 0)) {
//restore all the fields from those NSString variables and set segment on 1
}
но приложение завершает работу.
У меня возникает эта проблема, только если я запускаю приложение на iPhone, а не на симуляторе, потому что симулятор берет свое изображение прямо с фотопленки.
Это код для съемки фотографий.
-(IBAction)takePhoto:(id)sender {
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
self.imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imgPicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
} else {
imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
}
[self presentModalViewController:self.imgPicker animated:YES];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissModalViewControllerAnimated:YES];
int r = arc4random() % 9999;
NSDate *date = [NSDate date];
NSString *photoName = [dateNameFormatter stringFromDate:date];
photoName = [photoName stringByAppendingString:[NSString stringWithFormat:@"%d", r]];
if (imagePath) {
[imagePath release];
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", photoName]];
[imagePath retain];
UIImage *picture = [[info objectForKey:UIImagePickerControllerOriginalImage] retain];
// ----- CODE FOR SCALE THE IMAGE ----- //
if (picture.size.width == 1936) {
picture = [picture scaleToSize:CGSizeMake(480.0f, 720.0f)];
} else {
picture = [picture scaleToSize:CGSizeMake(720.0f, 480.0f)];
}
photoPreview.image = picture;
photoPreview.contentMode = UIViewContentModeScaleAspectFit;
CGRect frame = photoPreview.frame;
if (picture.size.width == 480) {
frame.size.width = 111.3;
frame.size.height =167;
} else {
frame.size.width = 167;
frame.size.height =111.3;
}
photoPreview.frame = frame;
// ----- ----- - END CODE - ----- ----- //
NSData *webData = UIImagePNGRepresentation(picture);
//CGImageRelease([picture CGImage]);
[webData writeToFile:imagePath atomically:YES];
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissModalViewControllerAnimated:YES];
}
Ответ №1:
при использовании UIImagePickerController система обычно вызывает предупреждение о памяти. Это приводит к тому, что все загруженные представления выгружаются, чтобы освободить часть памяти. Я предполагаю, что в вашем случае вы неправильно сохраняете состояние и при втором вызове «viewDidLoad:» не можете повторно запустить просмотр.
вы должны написать viewDidLoad таким образом, чтобы он мог вызываться более одного раза и при этом вести себя одинаково.