2009-07-30 11 views
5

Me gustaría utilizar un UITableView modal al inicio para pedir a los usuarios la contraseña, etc., si aún no están configurados. Sin embargo, el comando para llamar a la vista de uitable no parece funcionar dentro de viewDidLoad.¿Puede presentModalViewController funcionar en el inicio?

código de inicio:

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

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

Sin embargo, el mismo código funciona bien cuando se le llama más tarde por un botón:

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

pregunta relacionada: ¿cómo me siento (en el nivel superior) cuando el UITableView ha utilizado el comando para salir?

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

Respuesta

7

Usted puede realizar la llamada presentModalViewController:animated: otras partes de código - que debería funcionar en el método del controlador de vista viewWillAppear, o en el método applicationDidFinishLaunching en el delegado de la aplicación (aquí es donde pongo mis controladores modales en el lanzamiento).

En cuanto a saber cuándo desaparece el controlador de vista, puede definir un método en el controlador de vista primario y anular la implementación de dismissModalViewControllerAnimated en el controlador secundario para llamar al método. Algo como esto:

// 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

intenté viewWillAppear y obtuve el mismo efecto negativo que viewdidload. Cuando uso [self presentModalViewController: navigationController animado: YES]; en applicationDidFinishLaunching, obtengo "SIGABRT". Probablemente lo llame incorrectamente – BankStrong

+0

No se puede llamar desde 'applicationDidFinishLaunching' - ese es un método que pertenece al delegado, que no es un controlador de vista. Necesita el objeto del controlador de vista raíz. A menudo, Xcode lo crea automáticamente para usted; busque una propiedad sintetizada llamada 'viewController',' rootController', o 'tabBarController', según su tipo de aplicación. – Tim

+1

Eso puede haber estado claro (lo siento!); lo que quise decir fue en 'applicationDidFinishLaunching' no puede ejecutar' [self present ...] '- en su lugar debe ejecutar' [self.viewController present ...] 'o similar, dependiendo del nombre de su controlador de vista objeto. – Tim

0

Si va a hacerlo así, entonces van a tener que declarar su propio protocolo para ser capaz de decir cuando el UITableView desestimó la parentViewController, por lo que se declara un protocolo que tiene un método como

-(void)MyTableViewDidDismiss 

entonces en su clase padre que puede implementar este protocolo y después dismissModalView en tableView puede llamar MyTableViewDidDismiss en el delegado (que atraparán es el controlador de vista de los padres).

6

Tuve el mismo problema. Sé que el tema es antiguo, pero tal vez mi solución podría ayudar a alguien más ... Sólo tiene que mover su definición modal en un método:

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

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

A continuación, en viewDidLoad, llame a su método de definición modal en un performSelector:withObject:afterDelay: con 0 como valor de retraso. De esta manera:

- (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]; 
} 

Todavía no entiendo por qué la forma 'estándar' no funciona.

+0

Gracias por publicar esto. He estado tratando de hacer que esto funcione por días y esto ha resuelto un problema similar al mío. Al igual que usted, no tengo idea de por qué el primero no funciona, pero el segundo sí lo hace, pero aún así el problema está resuelto. – gnuchu

+0

Gracias!Esto funcionó muy bien. –

Cuestiones relacionadas