2012-04-21 12 views
7

Mam uniwersalną aplikację, która pozwala wybrać obraz z biblioteki zdjęć urządzenia do późniejszej manipulacji, kod działa dobrze na iPadzie, ale nic nie dzieje się na iPhonie, nawet przycisk anulowania i po wybraniu obrazu nic się nie dzieje ani tutaj nie jest mój kod:Problemy z przyciskiem anulowania UIImagePickerController nie działa

-(IBAction)grabImage:(id)sender 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
    imgPicker = [[UIImagePickerController alloc] init]; 
    [imgPicker setDelegate:self]; 

    popover = [[UIPopoverController alloc] initWithContentViewController:imgPicker]; 
    [popover setDelegate:self]; 

    CGPoint position  = [view1.superview convertPoint:view1.frame.origin toView:nil]; 
    CGRect popOverFrame  = CGRectMake(position.x, position.y, self.view.frame.size.width, self.view.frame.size.height); 

    [popover presentPopoverFromRect:popOverFrame inView:self.view permittedArrowDirections:nil animated:NO]; 
    [popover setPopoverContentSize:CGSizeMake(320, 480)]; 
    [imgPicker release]; 
} 
else 
{ 
    imgPicker = [[UIImagePickerController alloc] init]; 
    imgPicker.delegate = self; 
    imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentModalViewController:self.imgPicker animated:YES]; 
    [imgPicker release]; 
} 
} 


-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    pickedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 

CGImageRef imgRef = pickedImage.CGImage; 

    app->setImage(pickedImage, CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 

    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

// Enable texture siwth after an image has been loaded 
[textureSwitch setEnabled:YES]; 
[textureSwitch setOn:YES]; 
app->isTextureDrawingOn  = [textureSwitch isOn]; 

[fillsSwitch setOn:NO]; 
app->isFillsDrawingOn  = [fillsSwitch isOn]; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
    [popover dismissPopoverAnimated:YES]; 
} 
ofLog(OF_LOG_VERBOSE, "cancel after selection"); 
} 

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

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
     [popover dismissPopoverAnimated:YES]; 
    } 

ofLog(OF_LOG_VERBOSE, "did cancel"); 
} 
+0

Sprawdź Czy dodać uiimagepickercontrollerdelegate w pliku interfejsu ?? –

+1

Chociaż to nie rozwiąże problemu, powinieneś przełączyć się do używania 'presentViewController: animated: completion:' i 'dismissViewControllerAnimated: completion:' w miejsce 'presentModalViewController: animated:' i 'dismissModalViewControllerAnimated:', ponieważ te dwa ostatnie są przestarzałe (patrz [docs] (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html)). –

+0

Po przeczytaniu wszystkich sugestii za pomocą [self dismissModalViewControllerAnimated: YES]; naprawia problem w pewnym zakresie, ale co się dzieje teraz, to, że widok, który ma przycisk, aby otworzyć próbnik obrazu znika, jakieś pomysły? –

Odpowiedz

19

Zamiast używać poniższego kodu.

[[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

Spróbuj kod

[self dismissModalViewControllerAnimated:YES]; 

a także sprawdzić, czy dodać UIImagePickerControllerDelegate w pliku interfejsu.

ROZWIĄZANIE: (Z mojego komentarzu)

Spróbuj [self.imgPicker dismissModalViewControllerAnimated:YES]; to będzie działać.

Dla iOS 7: Aby zamknąć obecny kontroler widoku

[self.imgPicker dismissViewControllerAnimated: YES completion: NULL]; 
+0

Korzystanie z własnej sprawia, że ​​wszystkie widoki znikną, wszystko, czego potrzebuję, to anulowanie widoku wyboru obrazu, działa dobrze na iPad, ale nie działa na iPhone'a –

+2

, a następnie spróbuj tego [self.imgPicker dismissModalViewControllerAnimated: YES]; –

+1

W przypadku iOS 7 wydaje się, że działa: [picker dismissViewControllerAnimated: YES completion: NULL]; – russes

7

Dodaj UIImagePickerControllerDelegate w pliku interfejsu

a następnie wdrożyć ten kod w pliku .m

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

ja mam nadzieję, że to rozwiąże twój problem.

2

Sprawdź viewWillAppear lub viewDidAppear metody kontrolera nadrzędnego, który wywołuje selektor. Na iPhonie ta metoda zostanie wywołana po zniknięciu widoku pobierania. Nie będą wywoływane po zniknięciu popover na iPadzie. Właśnie znalazłem błąd w moim kodzie, gdzie ustawiłem zero dla ivar dla wybranego obrazu w viewWillAppear. zajęło mi dwa dni, aby zrozumieć, co się stało;) Powodzenia!

1

najprostszym rozwiązaniem:

Dodaj UIImagePickerControllerDelegate w pliku interfejsu

a następnie wdrożyć ten kod w pliku .m

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [picker dismissViewControllerAnimated:YES completion:nil]; 
} 
0

Do zamykania go w Swift:

Po dodaniu tych protokołów do ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate

internal func imagePickerControllerDidCancel(picker: UIImagePickerController){ 
    dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Proszę wyjaśnić, dlaczego to działa. –

+0

@RohitGupta Przetestowałem to i działa dobrze. odkąd zaimplementowałem delegata 'UIImagePickerControllerDelegate' na moim ViewController – MBH

0

Swift 3,0

Dzięki mbH ten pracował dla mnie w moim Xcode iOS 8 i 10 projektu:

internal func imagePickerControllerDidCancel(_ picker: UIImagePickerController){ 
    dismiss(animated: true, completion: nil) 
} 
Powiązane problemy