2012-11-30 9 views
14

Próbuję utworzyć kontroler widoku modalnego po wybraniu obrazu z selektora obrazu. Używam kod:iOS: Ostrzeżenie: Spróbuj zaprezentować <ModalViewController> na <ViewController> podczas trwania prezentacji

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

    NSLog(@"Picker has returned"); 
    [self dismissModalViewControllerAnimated:YES]; 



    // TODO: make this all threaded? 
    // crop the image to the bounds provided 
    img = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    NSLog(@"orig image size: %@", [[NSValue valueWithCGSize:img.size] description]); 

    // save the image, only if it's a newly taken image: 
    if([picker sourceType] == UIImagePickerControllerSourceTypeCamera){ 
     UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil); 
    } 

    // self.image_View.image=img; 
    //self.image_View.contentMode = UIViewContentModeScaleAspectFit; 


    ModalViewController *sampleView = [[ModalViewController alloc] init]; 
    [self presentModalViewController:sampleView animated:YES]; 
} 

Jednak otrzymane ostrzeżenie:

Warning: Attempt to present <ModalViewController: 0x7561600> on <ViewController: 0x75a72e0> while a presentation is in progress! 

i modalne widoku się nie pojawia.

Co robię źle?

+0

** KOMPLETNE ROZWIĄZANIE TUTAJ **, Jana odpowiedź: http://stackoverflow.com/questions/14453001/meaning-of-warning-while- a-prezentacja-jest-w toku – Fattie

Odpowiedz

28
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    // TODO: make this all threaded? 
    // crop the image to the bounds provided 
    img = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    NSLog(@"orig image size: %@", [[NSValue valueWithCGSize:img.size] description]); 

    // save the image, only if it's a newly taken image: 
    if ([picker sourceType] == UIImagePickerControllerSourceTypeCamera) { 
     UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil); 
    } 

    // self.image_View.image = img; 
    // self.image_View.contentMode = UIViewContentModeScaleAspectFit; 

    NSLog(@"Picker has returned"); 
    [self dismissViewControllerAnimated:YES 
          completion:^{ 
           ModalViewController *sampleView = [[ModalViewController alloc] init]; 
           [self presentModalViewController:sampleView animated:YES]; 
          }]; 
} 
+1

Po prostu, aby dodać, że blok zakończenia jest wykonywany po zwolnieniu kontrolera widoku, nie następuje on natychmiast po zakończeniu. viewWillAppear i viewDidAppear dają szansę na uruchomienie przed ukończeniem bloku. –

+0

Jedna krótka notka, ponieważ raz zostałem zapytany przez agenta personelu w Runtastic i nie wiedziałem o tym: – NicTesla

5

Tutaj pojawia się problem, ponieważ najpierw odrzucasz UIImagePicker i natychmiast wyświetlasz inny widok jako widok modalny. Właśnie dlatego otrzymujesz ten błąd.

Sprawdź z następującego kodu:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

[self dismissViewControllerAnimated:NO completion:^{ 

    img = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    NSLog(@"orig image size: %@", [[NSValue valueWithCGSize:img.size] description]); 

    if([picker sourceType] == UIImagePickerControllerSourceTypeCamera) 
    { 
     UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil); 
    } 

    ModalViewController *sampleView = [[ModalViewController alloc] init]; 
    [self presentModalViewController:sampleView animated:YES]; 
    }]; 
} 
+0

Nadal może zwolnić to z animacją – Moxy

+1

Twoja odpowiedź jest podobna do mojej (usunę kopalnię, ponieważ nie ma znaczenia, że ​​ta sama odpowiedź została wysłana dwa razy). Rozwiązaniem jest metoda z procedurą obsługi zakończenia. Ale jeśli użyłby [self dismissModalViewControllerAnimated: NO], nie otrzymałby tego ostrzeżenia w ogóle. – Moxy

+0

@Moxy: nie usuwaj swojego kolesia z odpowiedzi. Jest wiele różnic między obiema odpowiedziami. Twoja jest najlepsza. Więc nie usuwaj go. –