2009-06-22 18 views
6

Me gustaría lanzar un controlador de vista modal de la forma en que lo hace con 'ABPeoplePickerNavigationController' y sin tener que crear un controlador de navegación que contenga el controlador de vista.Ejecutando un UINavigationController modal

Al hacer algo similar, se obtiene una pantalla en blanco sin título para la barra de navegación y no hay ningún archivo de plumilla asociado cargado para la vista, aunque invoco initWithNibName cuando se invoca 'init'.

Mi controlador se parece a:

@interface MyViewController : UINavigationController 

@implementation MyViewController 
- (id)init { 
    NSLog(@"MyViewController init invoked"); 
    if (self = [super initWithNibName:@"DetailView" bundle:nil]) { 
     self.title = @"All Things"; 
    } 
    return self; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"All Things - 2"; 
} 

@end 

Cuando se utiliza el controlador de AB, todo lo que hacemos es:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
picker.peoplePickerDelegate = self; 

[self presentModalViewController:picker animated:YES]; 
[picker release]; 

ABPeoplePickerNavigationController se declara como:

@interface ABPeoplePickerNavigationController : UINavigationController 

La otra forma de cree una vista modal como se sugiere en la "Guía de programación del controlador de vista de Apple para iPhone OS ':

// Create a regular view controller. 
MyViewController *modalViewController = [[[MyViewController alloc] initWithNibName:nil bundle:nil] autorelease]; 

// Create a navigation controller containing the view controller. 
UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController:modalViewController]; 

// Present the navigation controller as a modal view controller on top of an existing navigation controller 
[self presentModalViewController:secondNavigationController animated:YES]; 

que puede crear de esta manera fina (siempre y cuando se cambia el MyViewController heredar de UIViewController en lugar de UINavigationController). ¿Qué más debería estar haciendo con MyViewController para iniciarlo de la misma manera que ABPeoplePickerNavigationController?

Respuesta

4

me gustaría lanzar un controlador de vista modal de la manera que se hace con 'ABPeoplePickerNavigationController' y eso es sin tener que crear un controlador de navegación que contiene el controlador de vista

Pero esto es exactamente lo ABPeoplePickerNavigationController está haciendo. No es mágico, es un UINavigationController que crea una instancia de UIViewController internamente (una UITableView que se rellena con los contactos de su libreta de direcciones) y configura el UIViewController como su vista raíz.

De hecho, puede crear su propia subclase similar UINavigationcontroller. Sin embargo, dentro de su inicializador, necesitará crear un controlador de vista para cargar como su vista de raíz al igual que lo hace ABPeoplePickerNavigationController.

A continuación, puede hacer lo que usted está tratando de esta manera:

[self presentModalViewController:myCutsomNavigationController animated:YES]; 

En el código que envió:

@interface MyViewController : UINavigationController 

@implementation MyViewController 
- (id)init { 
    NSLog(@"MyViewController init invoked"); 
    if (self = [super initWithNibName:@"DetailView" bundle:nil]) { 
     self.title = @"All Things"; 
    } 
    return self; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.title = @"All Things - 2"; 
} 

@end 

Sospecho que usted está teniendo problemas NIB. no hay un enchufe "rootViewController" para conectarse. Es por eso que tienes una pantalla en blanco.

El initalizer usted debe utilizar internamente es la siguiente:

self = [super initWithRootViewController:myCustomRootViewController]; 
Cuestiones relacionadas