После фотосъемки viewDidLoad загружается - PullRequest
0 голосов
/ 22 октября 2011

На мой взгляд, у меня есть несколько полей, некоторые из них скрыты.
Есть сегмент контроллера с 2 опциями.
Чтобы включить кнопку «сделать фото», она должна быть установлена ​​на 1.
Итак, я заполняю поля, которые вижу, нажимаю сегментированный контроллер в позиции 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 Ответ

1 голос
/ 22 октября 2011

при использовании UIImagePickerController система обычно вызывает предупреждение о памяти. Это приводит к тому, что все представления, которые загружаются, выгружаются, чтобы освободить часть памяти. Я предполагаю, что в вашем случае вы не сохраняете состояние правильно и при втором вызове «viewDidLoad:» и не можете повторно запустить представление.

Вы должны написать viewDidLoad так, чтобы его можно было вызывать более одного раза, и он будет вести себя одинаково.

...