2009-07-18 4 views
2

J'ai une sous-classe UIViewController appelée TripViewController. Cette classe a la méthode suivante:Ajout d'une vue à presentModalViewController

- (void)lockScreen { 
    LockOverlay *lockOverlay = [[LockOverlay alloc] init]; 
    [self presentModalViewController: lockOverlay animated:YES]; 
} 

LockOverlay est également une sous-classe UIViewController, défini comme suit (le reste du code est juste talons auto-générés):

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    CGRect frame = CGRectMake(0, 0, 225, 37); 
    UIImageView *sliderBackground = [[UIImageView alloc] initWithFrame:frame];  
    sliderBackground.image = [UIImage imageNamed:@"slider-bar.png"]; 
    UIImageView *unlock = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unlock.png"]]; 
    [sliderBackground addSubview:unlock]; 
    frame = CGRectMake(10, 360, 225, 37); 
    Slider *slider = [[Slider alloc] initWithFrame:frame]; 
    [slider addSubview:sliderBackground]; 
    slider.unlock = unlock; 
    [self.view addSubview:slider]; 
} 

Lorsque LockScreen est appelée, le programme va dans une boucle infinie, et loadView est appelé encore et encore.

Alors, qu'est-ce que je fais mal ici? J'ai déjà eu un bug comme ça ... Dans l'App Delegate, je crée un TabBarController, et l'une des vues a un NavigationController. J'ai eu le même genre de bogue quand j'ai essayé d'ajouter la Vue au lieu du NavigationViewController au tableau tabBar. Je suppose que ce problème est similaire et je ne pousse pas le nouveau ViewController au bon endroit, mais c'est juste une supposition.

Répondre

0

J'ai changé loadView pour être initWithFrame et retourné self. Ça fonctionne maintenant.

0

avant

[self.view addSubview:slider]; 

vous devriez avoir quelque chose comme

self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

C'est parce que self.view n'existe pas encore ... c'est ce que loadview est pour! Il est documenté dans les documents UIViewController que l'implémentation de la propriété view est la suivante: lorsqu'elle est accédée (vs assignée) et jusqu'à présent elle est nulle, elle appelle loadView pour créer la vue en premier. Votre loadView supposait qu'une vue existait et essayait d'ajouter une sous-vue, cet accès obligeait le contrôleur de vue à rappeler loadView.

Un remplacement de loadView doit toujours affecter self.view à certains-view-that-fills-the-screen

Questions connexes