2009-06-22 4 views
6

Je voudrais lancer un contrôleur de vue modale comme on le fait avec 'ABPeoplePickerNavigationController' et sans avoir à créer de contrôleur de navigation contenant le contrôleur de vue. Faire quelque chose de similaire donne un écran vide sans titre pour la barre de navigation et aucun fichier nib associé n'est chargé pour la vue même si j'appelle le initWithNibName lorsque le 'init' est appelé.Lancement d'un UINavigationController modal

Mon contrôleur ressemble à:

@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 

Lorsque vous utilisez le contrôleur AB, tout ce que vous faites est:

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

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

ABPeoplePickerNavigationController est déclarée comme:

@interface ABPeoplePickerNavigationController : UINavigationController 

L'autre façon de créer une vue modale comme suggéré dans le 'View Controller Programming Guide' d'Apple pour 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]; 

je peux créer cette belle façon (aussi longtemps que je change le MyViewController d'hériter de UIViewController au lieu de UINavigationController). Quoi d'autre devrais-je faire à MyViewController pour lancer de la même manière que ABPeoplePickerNavigationController?

Répondre

4

Je voudrais lancer un contrôleur de vue modal comme on le fait avec « ABPeoplePickerNavigationController » et qui est sans avoir à créer un contrôleur de navigation contenant le contrôleur de vue

Mais c'est exactement ce que ABPeoplePickerNavigationController fait. Ce n'est pas de la magie, c'est un UINavigationController qui instancie un UIViewController en interne (un UITableView qui est peuplé avec vos contacts du carnet d'adresses) et définit le UIViewController en tant que vue racine.

Vous pouvez en effet créer votre propre sous-classe UINavigationcontroller similaire. Cependant, dans son initialiseur, vous devrez créer un contrôleur de vue à charger en tant que vue racine, comme le fait ABPeoplePickerNavigationController.

Ensuite, vous pouvez faire ce que vous essayez comme ceci:

[self presentModalViewController:myCutsomNavigationController animated:YES]; 

Dans le code affiché:

@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 

Je soupçonne que vous rencontrez des problèmes NIB. il n'y a pas de prise "rootViewController" à connecter. C'est pourquoi vous avez un écran vide.

Le initalizer vous devriez utiliser est interne ceci:

self = [super initWithRootViewController:myCustomRootViewController]; 
Questions connexes