web-dev-qa-db-fra.com

Impossible de faire fonctionner presentViewController

J'ai copié une classe de travail viewcontroller d'un autre projet dans un nouveau projet. Je n'arrive pas à charger la vue dans le nouveau projet. Dans l'ancien projet, j'utilisais presentModalViewController. Dans la nouvelle version, je ne parviens pas à charger la vue avec presentModalViewController ou presentViewController.

J'essaie de charger la vue actuelle à partir de mon contrôleur de vue principale. 

Voici à quoi ressemble mon interface de contrôleur de vue principale ...

//  ViewController.h
#import <UIKit/UIKit.h>
#import "RequestDialogViewController.h"

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> {

}

- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response;

J'utilise presentModalViewController comme ceci ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController];
[self presentModalViewController:navigationController animated:YES];

et presentViewController comme ça ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController"  bundle:nil];    
[self presentViewController:requestIPViewController animated:YES completion:nil];

Qu'est-ce qui me manque dans le nouveau projet? La méthode init se déclenche, mais viewDidLoad ne le fait pas et rien n’est affiché.

Merci

34
user278859

Si ViewController est le contrôleur de vue racine, il ne peut pas présenter un contrôleur de vue modal à partir de sa propre viewDidLoad, car à ce stade, il ne dispose pas d'informations telles que la taille de l'écran.

Si d'autres contrôleurs de vue ont déjà été affichés, cela fonctionnera. Si le contrôleur de vue racine est une UINavigationController, vous verrez une vue glisser à partir de la droite, tandis que la vue modale monte à partir du bas.

Quoi qu'il en soit, pour votre ViewController, le plus tôt possible, vous pourrez le présenter une fois que celle-ci est devenue visible. L'utilisation d'une minuterie pour cela n'est pas fiable; Les appareils plus anciens et plus lents ont des temps de chargement considérablement plus longs. 

Pour plus de fiabilité, implémentez viewDidAppear: pour ViewController. Utilisez toujours votre système de minuterie pour ajouter un délai supplémentaire. une fraction de seconde devrait suffire. Bien que la présentation du contrôleur de vue modale depuis viewDidAppear fonctionne pour moi dans le simulateur iOS 5.1, La présentation d’un contrôleur de vue modal lors du chargement d’un autre ViewController indique que cela ne se produit parfois pas.

82
Dondragmer

Je l'ai résolu. J'essayais de présenter la vue de vue ne charge du contrôleur de vue principale. Je ne sais pas pourquoi cela ne fonctionne pas là-bas, mais je mets maintenant une minuterie qui appelle une méthode pour présenter le contrôleur de vue après le chargement de la vue principale.

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Merci à ceux qui ont répondu.

4
user278859

Comme @Dondragmer l'a dit, si vous voulez présenter votre viewController dans viewDidLoad de la vue racine, il échouera.Une fois que votre viewController est prêt, vous pouvez présenter votre nouveau viewController . 

- (void)viewDidLayoutSubviews {
    //present here
}
3
SeanChense

J'ai rencontré le même problème. Mais ma situation est que la presentViewController est appelée après la dismissViewControllerAnimated pour un autre ViewController. Ma solution consiste à déplacer le presentViewController vers le bloc d'achèvement de dismissViewControllerAnimated.

0
Bagusflyer