Warning: Attempt to present <UIImagePickerController: 0x208da170> on <ATTabBarController: 0x1f54f780> whose view is not in the window hierarchy!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Warning: Attempt to present <UIImagePickerController: 0x208da170> on <ATTabBarController: 0x1f54f780> whose view is not in the window hierarchy!

    Hallo zusammen...

    Habe da wieder ein dummes Problem. Und zwar habe ich einen Tabbar Controller, der 5 Items besetzt. Das welches ich benötige, ruft eine WebView auf (ATWebViewController). Bis hierhin funktioniert es. Nun habe ich aber mit Code noch einen Kamerabutton hinzugefügt. Der Code sieht so aus im TabBarController.m:

    Quellcode

    1. #pragma mark - UITabBarControllerDelegate
    2. - (void)dismissWebView {
    3. [self dismissViewControllerAnimated:YES completion:nil];
    4. }
    5. - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    6. if ([viewController isKindOfClass:[ATWebViewController class]]) {
    7. NSURL *url = nil;
    8. if (viewController.tabBarItem.tag == 0) {
    9. url = [NSURL URLWithString:@"http://---.de"];
    10. }
    11. else if (viewController.tabBarItem.tag == 1) {
    12. url = [NSURL URLWithString:@"http://---.de"];
    13. }
    14. // if viewController.tabBarItem.tag==0
    15. ATWebViewController *webViewController = [[ATWebViewController alloc] initWithNibName:nil bundle:nil URL:url];
    16. UINavigationController *navigationBarController = [[UINavigationController alloc] initWithRootViewController:webViewController];
    17. navigationBarController.navigationBar.tintColor = ATNavigationBarTintColor;
    18. if (viewController.tabBarItem.tag == 0) {
    19. webViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissWebView)];
    20. webViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(TakePhoto)];
    21. }
    22. else if (viewController.tabBarItem.tag == 1) {
    23. webViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissWebView)];
    24. }
    25. navigationBarController.modalPresentationStyle = UIModalPresentationFullScreen;
    26. [self presentModalViewController:navigationBarController animated:YES];
    27. return NO;
    28. }
    Alles anzeigen


    Das funktioniert auch noch, auch mit den Tags, der Button wird entsprechend angezeigt. Nun möchte ich, dass sich bei einem Tap auf die Kamera eben diese öffnet. Dazu habe ich folgenden Code im TabBarController.m:

    Quellcode

    1. #pragma mark - Capture Photo
    2. - (IBAction)TakePhoto {
    3. picker = [[UIImagePickerController alloc] init];
    4. picker.delegate = self;
    5. [picker setSourceType:UIImagePickerControllerSourceTypeCamera];
    6. [self presentViewController:picker animated:YES completion:NULL];
    7. }
    8. - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    9. image = [info objectForKey:UIImagePickerControllerOriginalImage];
    10. [imageView setImage:image];
    11. [self dismissViewControllerAnimated:YES completion:NULL];
    12. }
    13. - (void)imagePickerControlerDidCancel:(UIImagePickerController *)picker {
    14. [self dismissViewControllerAnimated:YES completion:NULL];
    15. }
    Alles anzeigen


    Im Header File vom Tabbar Controller habe ich das hier drin:

    Quellcode

    1. @interface ATTabBarController : UITabBarController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
    2. UIImagePickerController *picker;
    3. UIImage *image;
    4. IBOutlet UIImageView *imageView;
    5. }
    6. @end


    Nun ist das Problem, dass jedes Mal wenn ich das Kamerasymbol antippe, diese Warnung in der Console ausgespuckt wird und es passiert nichts am Gerät:

    Warning: Attempt to present <UIImagePickerController: 0x208da170> on <ATTabBarController: 0x1f54f780> whose view is not in the window hierarchy!


    Wo liegt hier der Fehler?
  • Steht doch dort. Der ATTabBarController bzw. dessen View wird aktuell nicht angezeigt und somit kannst Du von diesem ViewController auch keinen anderen ViewController per presentModalViewController:animated: anzeigen.

    Laut Code wird ja der NavigationController modal vom ATTabBarController angezeigt, wenn der Button mit der Action TakePhoto angezeigt wird. Somit müsstest Du den ImagePickerController modal vom NavigationController aus anzeigen, also mit:

    Quellcode

    1. [self.modalViewController presentViewController:picker animated:YES completion:NULL];
  • Ein kleines Problem gibt es doch noch. Wenn ich ein Foto geschossen habe, und dann auf "Verwenden" tippe, dann wird die komplette WebView geschlossen... Code ist so:

    Quellcode

    1. #pragma mark - Save Photo
    2. - (void) imagePickerController: (UIImagePickerController *) picker
    3. didFinishPickingMediaWithInfo: (NSDictionary *) info {
    4. NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
    5. UIImage *originalImage, *editedImage, *imageToSave;
    6. // Handle a still image capture
    7. if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0)
    8. == kCFCompareEqualTo) {
    9. editedImage = (UIImage *) [info objectForKey:
    10. UIImagePickerControllerEditedImage];
    11. originalImage = (UIImage *) [info objectForKey:
    12. UIImagePickerControllerOriginalImage];
    13. if (editedImage) {
    14. imageToSave = editedImage;
    15. } else {
    16. imageToSave = originalImage;
    17. }
    18. // Save the new image (original or edited) to the Camera Roll
    19. UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil);
    20. UIAlertView *alert;
    21. alert= [[UIAlertView alloc]
    22. initWithTitle:NSLocalizedStringFromTable(@"Saved", @"ATLocalizable", @"")
    23. message:NSLocalizedStringFromTable(@"Your picture has been saved", @"ATLocalizable", @"")
    24. delegate:self
    25. cancelButtonTitle:@"OK"
    26. otherButtonTitles:nil];
    27. [alert show];
    28. }
    29. [self dismissModalViewControllerAnimated:YES];
    30. }
    Alles anzeigen


    Merkwürigerweise passiert das nicht, wenn ich einfach abbreche. Der Code dazu sieht so aus:

    Quellcode

    1. - (void)imagePickerControlerDidCancel:(UIImagePickerController *)picker {
    2. [self dismissModalViewControllerAnimated:NO];
    3. }


    Wenn ich das noch hinbekomme, dann bin ich glücklich... :p
  • Leute nachdenken bitte. Wenn Du den ImagePickerController über

    Quellcode

    1. [self.modalViewController presentViewController:picker animated:YES completion:NULL];
    , also aus dem NavigationController heraus modal öffnest, dann musst Du diesen auch mit

    Quellcode

    1. [self.modalViewController dismissModalViewControllerAnimated:YES];
    , also den modalen ViewControllen vom NavigationController schliessen, oder?

    Mit

    Quellcode

    1. [self dismissModalViewControllerAnimated:YES]
    schliesst sich der modale ViewController des ATTabBarController, also in Deinem Fall der NavigationController mit dem WebViewController. ;)

    Das ganze Problem entsteht nur dadurch, dass sich der Code für das öffnen und schliessen des ImagePickerControllers im ATTabBarController und nicht im WebViewController befindet, in dessen NavigationBar sich ja auch der Button für den ImagePickerController befindet. ;)