2009-07-30 8 views
5

Je souhaite utiliser un UITableView modal au démarrage pour demander aux utilisateurs un mot de passe, etc. s'ils ne sont pas déjà configurés. Cependant, la commande permettant d'appeler uitableview ne semble pas fonctionner dans viewDidLoad.Can presentModalViewController peut-il fonctionner au démarrage?

code de démarrage:

- (void)viewDidLoad { 
    rootViewController = [[SettingsController alloc] 
    initWithStyle:UITableViewStyleGrouped]; 
    navigationController = [[UINavigationController alloc]  
    initWithRootViewController:rootViewController]; 

    // place where code doesn't work 
    //[self presentModalViewController:navigationController animated:YES]; 
} 

Cependant, le même code fonctionne très bien lorsqu'il est appelé plus tard par un bouton:

- (IBAction)settingsPressed:(id)sender{ 
    [self presentModalViewController:navigationController animated:YES]; 
} 

question connexe: comment puis-je sens (au niveau supérieur) lorsque la UITableView a utilisé la commande pour quitter?

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

Répondre

7

Vous pouvez placer l'appel ailleurs presentModalViewController:animated: dans le code - il devrait fonctionner dans la méthode viewWillAppear du contrôleur de vue, ou dans la méthode applicationDidFinishLaunching dans le délégué de l'application (c'est là que je place mes contrôleurs modales sur le lancement). Pour savoir quand le contrôleur de vue disparaît, vous pouvez définir une méthode sur le contrôleur de vue parent et remplacer l'implémentation de dismissModalViewControllerAnimated sur le contrôleur enfant pour appeler la méthode. Quelque chose comme ceci:

// Parent view controller, of class ParentController 
- (void)modalViewControllerWasDismissed { 
    NSLog(@"dismissed!"); 
} 

// Modal (child) view controller 
- (void)dismissModalViewControllerAnimated:(BOOL)animated { 
    ParentController *parent = (ParentController *)(self.parentViewController); 
    [parent modalViewControllerWasDismissed]; 

    [super dismissModalViewControllerAnimated:animated]; 
}
+0

essayé viewWillAppear et obtenu le même mauvais effet que viewdidload. Quand j'utilise [self presentModalViewController: navigationController animé: YES]; dans applicationDidFinishLaunching, je reçois "SIGABRT". Je l'appelle probablement mal – BankStrong

+0

Impossible de l'appeler à partir de 'applicationDidFinishLaunching' - c'est une méthode appartenant au délégué, qui n'est pas un contrôleur de vue. Vous avez besoin de l'objet contrôleur de vue racine. Souvent, il est automatiquement créé pour vous par Xcode; Recherchez une propriété synthétisée appelée 'viewController',' rootController', ou 'tabBarController', en fonction de votre type d'application. – Tim

+1

Cela peut ne pas être clair (désolé!); ce que je voulais dire était dans 'applicationDidFinishLaunching' vous ne pouvez pas exécuter' [self present ...] '- à la place vous devez exécuter' [self.viewController present ...] 'ou similaire, en fonction du nom de votre contrôleur de vue objet. – Tim

0

Si vous allez le faire comme ça, alors vous allez devoir déclarer votre propre protocole pour être en mesure de dire quand la UITableView a rejeté la parentViewController, vous déclarez un protocole qui a une méthode comme

-(void)MyTableViewDidDismiss 

puis dans votre classe parent, vous pouvez mettre en œuvre ce protocole et après vous dismissModalView à tableView vous pouvez appeler MyTableViewDidDismiss sur le délégué (whihc est le contrôleur de vue parent).

6

J'ai eu tout à fait le même problème. Je sais que le sujet est vieux, mais peut-être ma solution pourrait aider quelqu'un d'autre ... il vous suffit de déplacer votre définition modale dans une méthode:

// ModalViewController initialization 
- (void) presentStartUpModal 
{ 
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil]; 
    startUpModal.delegate = self; 

    [self presentModalViewController:startUpModal animated:YES]; 
    [startUpModal release]; 
} 

Ensuite, viewDidLoad, appelez votre méthode modale de définition dans un performSelector:withObject:afterDelay: avec 0 comme valeur de retard. Comme ceci:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //[self presentStartUpModal]; // <== This line don't seems to work but the next one is fine. 
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0]; 
} 

Je ne comprends toujours pas pourquoi le mode «standard» ne fonctionne pas.

+0

Merci d'avoir posté ce message. J'ai essayé de faire fonctionner cela pendant des jours et cela a résolu un problème similaire. Comme vous, je ne sais pas pourquoi le premier ne fonctionne pas, mais le second fait - mais toujours résolu problème. – gnuchu

+0

Merci!Cela a bien fonctionné. –

Questions connexes