1

私は から を表示しUIImagePickerています。UIViewControllerUIViewControllerには がいくつかありUITextFieldます。

ユーザーがこれにいくつかの値を入力しUITextField、 から画像を選択するとUIImagePicker、メモリ警告が表示され、viewDidLoad が再度呼び出されますが、ユーザーが に入力したすべてのデータUITextFieldが欠落しています。どうすればこれに対処できますか?

コード:

- (void) showImageSelector: (UITapGestureRecognizer *) tapGestureRecognizer
{
    UIActionSheet *actionSheet;
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        actionSheet = [[UIActionSheet alloc] initWithTitle:[PNRConstants kChoosePhoto] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:[PNRConstants kPhotoLibrary], [PNRConstants kTakeAPicture], nil];
    }
    else{
        actionSheet = [[UIActionSheet alloc] initWithTitle:[PNRConstants kChoosePhoto] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:[PNRConstants kPhotoLibrary], nil];
    }
    [actionSheet showInView:self.view.window];
}

#pragma -
#pragma UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex != actionSheet.cancelButtonIndex) {
        UIImagePickerController *controller = [[UIImagePickerController alloc] init];
        controller.delegate = self;
        controller.allowsEditing = YES;
        if (buttonIndex == 0) {
            // Photo Library
            controller.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        }
        else {
            // Camera
            controller.sourceType = UIImagePickerControllerSourceTypeCamera;
        }
        [self presentViewController:controller animated:YES completion:nil];
    }
}
4

2 に答える 2

1

メモリが少なく、View Controller のビューが必要ない場合、ビューはメモリからアンロードされます。(ただし、iOS 6.0 からはそうではありません。ビューがメモリから消去されなくなったためです)。

そのため、メモリ警告を受け取ると、ビューはメモリからアンロードされます。それに戻ると、View Controllerのビューが再度要求されるため、再度作成/ロードされます。したがって、あなたviewDidLoadは再び呼ばれます。

現時点では、これは読み込まれたすべての新しい新鮮なビューです。以前のすべてのプロパティを失いました。

これを回避するためにできることは、ユーザーがテキストフィールドのプロパティを設定したとき(おそらくテキストです)、変数などのどこかにこれらの値を保持する必要があることです.

したがって、viewDidLoadその変数が存在するかどうか、および/または値を保持しているかどうかを確認してください。そうでない場合は、ビューが初めて読み込まれたことを意味します。ここでは、何もしません。

ただし、ユーザーがテキストフィールドにテキストを設定すると、コントローラーのビューがアンロードされ、後で再度ロードされ、viewDidLoad呼び出されます。ここで、この時点で、変数は以前に入力されたテキスト値を保持します。そのため、textField のセットを設定します。

要するに、コードは次のようになります。

-(void) viewDidLoad {
    [super viewDidLoad];

    if (yourVariableHoldingTextInput) {
        // Variable holding the text field's input exists. This means user had set some input to the text field. View was purged from memory and is now loaded again.
        yourTextField.text = yourVariableHoldingTextInput; // Essentially, set the text field's text with the variable's value.
    }else {
        // Here we do nothing. This clearly means the controller's view loaded very first time.
    }
}
于 2012-10-05T06:00:08.927 に答える
0

UIImagePicker はプロセッサからより多くのメモリを消費します..そのため、最初にこのメモリ警告を解決する必要があります。

ビデオ用のカメラと写真ライブラリを使用していたときに、同じ種類の問題が発生しました。

私がトリックを使用した後、それは解決しました。ここにトリックがあります

UIImagePickerController をグローバルに定義してアクセスする

そして、ここでコードを使用してライブラリを呼び出しています

-(UIImagePickerController *)getImagePickerController{
    if (!imagePickerController) {
        imagePickerController = [[UIImagePickerController alloc]init];
    }
    return imagePickerController;
}

この UIImagePicker インスタンスを videoPicker に呼び出した後

videoPicker = [self getImagePickerController]; 
    videoPicker = [[UIImagePickerController alloc] init];
    videoPicker.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;
    videoPicker.delegate = self;
    videoPicker.allowsEditing = YES;
    videoPicker.mediaTypes =  [NSArray arrayWithObject:(NSString *)kUTTypeMovie];    
    videoPicker.videoQuality = UIImagePickerControllerQualityTypeHigh;
    videoPicker.videoMaximumDuration = 30.0;
    NSArray *sourceTypes = [UIImagePickerController availableMediaTypesForSourceType:videoPicker.sourceType];
    if (![sourceTypes containsObject:(NSString *)kUTTypeMovie ])
    {
        NSLog(@"no video");
    }
    else
    {
        [self presentModalViewController:videoPicker animated:YES];
    }

メディアをキャンセルまたは選択した後、ピッカーのみを閉じて離します。videoPickerを解放して却下しないでください。

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{   
    [picker dismissModalViewControllerAnimated:YES];
}

そして、すでにピッカーインスタンスが存在する場合は、もう一度割り当てないでください。

于 2012-10-05T05:55:01.030 に答える