После съемки загружается viewDidLoad

#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 таким образом, чтобы он мог вызываться более одного раза и при этом вести себя одинаково.