web-dev-qa-db-fra.com

La présentation d'un contrôleur de vue modale masque la barre de navigation

J'ai une application basée sur la navigation avec une barre de navigation, mais il existe quelques cas où, au lieu de placer un contrôleur de vue sur la pile, je dois présenter le contrôleur de vue de manière modale. Le problème est que lorsque je ferme le contrôleur de vue modale, tout fonctionne comme prévu, sauf que la barre de navigation est masquée et que la vue (parent) a été redimensionnée, ce qui correspond au comportement attendu en fonction de la documentation. J'ai donc pensé que je pourrais simplement appeler une méthode intégrée pour afficher la barre de navigation. J'ai déjà essayé

[self.navigationController setNavigationBarHidden:NO];

ainsi que la version animée sans succès.

La documentation en parle dans la méthode

presentModalViewController: animated:

dans la section de discussion où il est dit,

Sur les appareils iPhone et iPod touch, la vue de modalViewController est toujours présentée en plein écran "et" Définit la propriété modalViewController sur le contrôleur de vue spécifié. Redimensionne sa vue et la lie à la hiérarchie des vues. "Toutefois, la documentation ne m'a pas indiqué comment annuler ce processus après avoir rejeté une vue modale.

Quelqu'un d'autre en a-t-il fait l'expérience et a-t-il trouvé une solution?

Edit: J'ai le même problème, donc au lieu de poser ma propre question, je parraine une prime pour celui-ci. C'est ma situation spécifique:

Dans mon cas, je présente un sélecteur d'images dans un contrôleur de vue modale, par-dessus un contrôleur de navigation:

-(void) chooseImage {
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        imagepicker = [[UIImagePickerController alloc] init];
        imagepicker.allowsEditing = NO;
        imagepicker.delegate = self;
        imagepicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagepicker.navigationBar.opaque = true;
        imagepicker.wantsFullScreenLayout = NO;

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

            if (self.view.window != nil) {
                popoverController = [[UIPopoverController alloc] initWithContentViewController:imagepicker];

                [popoverController presentPopoverFromBarButtonItem:reset permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
            } else {}

        } else {
            [self.navigationController presentModalViewController:imagepicker animated:YES];   
        }
    }
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [self.popoverController dismissPopoverAnimated:true];
    } else {
        [self.navigationController dismissModalViewControllerAnimated:YES];
    }
    //Save the image
}

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [self.popoverController dismissPopoverAnimated:true];
    } else {
        [self.navigationController dismissModalViewControllerAnimated:YES];
    }
}
17
EmphaticArmPump

Assurez-vous de présenter ET de rejeter le modalViewController du UINavigationController, comme suit:

// show
[self.navigationController presentModalViewController:vc animated:YES];
// dismiss
[self.navigationController dismissModalViewControllerAnimated:YES];

Si votre contrôleur de vue se trouve réellement sur la pile du contrôleur UINavigationController, il s'agit de la manière appropriée de gérer la présentation et le renvoi du contrôleur de vue modal. Si votre barre UINavigation est toujours cachée, il se passe quelque chose d'autre d'extraordinaire et nous aurions besoin de voir votre code pour déterminer ce qui se passe.

Modifier

J'ai copié votre code dans une de mes applications et le UIImagePickerController a été présenté et rejeté avec succès et le UINavigationBar de mon UINavigationController était toujours là. Je crois vraiment que le problème se situe ailleurs dans votre architecture. Si vous téléchargez un projet Zip avec un exemple, je jetterai un coup d'oeil.

18
Michael Frederick

Essayez simplement de suivre le code cela fonctionnera

SettingsViewController *settings    =   [[SettingsViewController alloc] init];
UINavigationController *navcont = [[UINavigationController alloc] initWithRootViewController:settings];
[self presentModalViewController:navcont animated:YES];
[settings release];
[navcont release];

Il est nécessaire de présenter le contrôleur de navigation afin d’avoir une barre de navigation sur le contrôleur présenté.

11
Priyank Ranka

Je pense avoir constaté ce comportement lors de la présentation d'un contrôleur de vue sur le mauvais VC. Appelez-vous presentModalViewController sur le contrôleur de navigation ou le VC individuel?

Essayez de l'appeler à partir du navigateurContrôleur si ce n'est déjà fait.

[self.navigationController presentModalViewController:myVC animated:YES];
3
Bob Spryn
AddContactVC *addController =[self.storyboard instantiateViewControllerWithIdentifier:@"AddContactVC"];
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];

travailler pour moi montre la barre de navigation

1
Asad ali

Regarde ça. Ceci est la documentation d'Apple sous la référence de classe UIViewController: 

Il indique clairement que la vue modale présente toujours en mode plein écran, il est donc évident que la barre de navigation sera masquée. Placez donc la barre de navigation séparée sur la vue modale pour revenir en arrière.

presentModalViewController:animated:
Presents a modal view managed by the given view controller to the user.

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
Parameters
modalViewController
The view controller that manages the modal view.
animated
If YES, animates the view as it’s presented; otherwise, does not.
Discussion
On iPhone and iPod touch devices, the view of modalViewController is always presented full screen. On iPad, the presentation depends on the value in the modalPresentationStyle property.

Sets the modalViewController property to the specified view controller. Resizes its view and attaches it to the view hierarchy. The view is animated according to the transition style specified in the modalTransitionStyle property of the controller in the modalViewController parameter.

Availability
Available in iOS 2.0 and later.

Nous espérons que cela vous aidera à comprendre que masquer la totalité de la vue avec le contrôleur de navigation est le comportement par défaut de la vue modale. Essayez donc de placer une barre de navigation distincte dans la vue modale pour naviguer.

Vous pouvez le vérifier plus loin sur ce lien 

http://developer.Apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

1
Parth Bhatt

Si vous présentez un contrôleur en tant que modèle, View controller apparaîtra à la vue totale.

Si vous souhaitez accéder aux propriétés du contrôleur de navigation par le biais de la vue Modèle, vous devez créer une autre référence du contrôleur de navigation. 

Cela peut être utile pour vous.

1
Rajesh

Une des meilleures solutions consiste à utiliser cette catégorie MaryPopin https://github.com/Backelite/MaryPopin

0
Abo3atef

Emphatic et Devin -

Lorsque j'ai commencé à lire les documents Apple pour me familiariser avec le problème, j'ai remarqué que la méthode que vous utilisez, presentModalViewController:animated:, semble être obsolète au profit de presentViewController:animated:completion:. Peut-être devriez-vous essayer d'utiliser cette méthode à la place.

Pour votre commodité, jetez un coup d'oeil par vous-même: 

presentModalViewController: animé: référence

Je vais essayer de mettre en place un programme de test rapide pour voir si ce que j'ai dit ci-dessus est réellement vrai. Mais tentez votre chance - peut-être que ça va aider!

0
ravron

Xcode a un modèle qui se rapproche beaucoup de ce que vous faites. D'après les résultats, je ne pense pas que vous devriez essayer d'exécuter [self.navigationController presentModalViewController: vc] et [self.navigationController licencierModalViewControllerAnimated:], mais plutôt simplement [auto presentModalViewController:] et [self clanModalViewController:].

pour voir comment le modèle le fait pour vous-même, vous pouvez utiliser l'assistant de création de projet de xcode 4.3. peut-être que cela vous donnera des indications:

Xcode new project wizard utility template

À partir de ce choix, choisissez Suivant, puis nommez votre projet test, choisissez "Universel", désactivez le comptage automatique des références, appuyez sur suivant, enregistrez à l’endroit où vous le souhaitez.

À présent, cliquez sur la cible et réglez la cible de déploiement sur la version 4.3 (ou 4.0 si vous préférez) à des fins de test, puis basculez vers votre appareil ou le simulateur iOS 4.3.

enfin, remplacez le code suivant dans applicationDidFinishLaunching: withOptions: dans le fichier AppDelegate.m créé:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone"
                                                                        bundle:nil] autorelease];
    } else {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad"
                                                                        bundle:nil] autorelease];
    }
    UINavigationController* navigationController
      = [[UINavigationController alloc] initWithRootViewController:self.mainViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    return YES;

maintenant, quand je lance ceci, il ne cache pas la barre de navigation. et dans le MainViewController.m créé à partir du modèle, vous verrez comment il présente le contrôleur de vue modale et le supprime du contrôleur lui-même et non du contrôleur de navigation. pour faire bonne mesure, pour que le code du modèle ressemble davantage au vôtre, allez dans MainViewController.m et supprimez la ligne qui définit le style de transition du contrôleur de vue modale ...

(Bien sûr, dans iOS 5, avec les story-boards, la même chose peut être accomplie avec les séquences modales ... c’est ce que j’ai fait pour les applications que je ne supporte pas pour les versions antérieures à la version 5.0 qui présentent un modalViewController mode.)

0
john.k.doe