2009-07-18 10 views
2

Ich habe eine UIViewController-Unterklasse namens TripViewController. Diese Klasse hat die folgende Methode:Hinzufügen einer Sicht mit presentModalViewController

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

LockOverlay ist auch eine UIViewController Unterklasse, wie folgt definiert (der Rest des Codes ist nur automatisch generiert Stubs):

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

Wenn Lockscreen aufgerufen wird, Das Programm geht in eine Endlosschleife und loadView wird immer wieder aufgerufen.

Also, was mache ich hier falsch? Ich hatte vorher einen solchen Fehler ... Im App-Delegate erstelle ich einen TabBarController, und eine der Ansichten hat einen NavigationController. Ich habe den gleichen Fehler bekommen, als ich versucht habe, die View anstelle des NavigationViewControllers zum tabBar Array hinzuzufügen. Ich nehme an, dass dieses Problem ähnlich ist und ich den neuen ViewController nicht an den richtigen Platz dränge, aber das ist nur eine Vermutung.

Antwort

0

Ich änderte loadView zu initWithFrame und gab self zurück. Es funktioniert jetzt.

0

vor

[self.view addSubview:slider]; 

Sie ... Das ist etwas wie

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

ist, weil self.view noch nicht existiert haben sollte, das ist, was für Loadview ist! In den UIViewController-Dokumenten ist dokumentiert, dass die implementation der view-Eigenschaft darin besteht, dass beim Aufruf (vsassigned) und bisher null es loadView aufruft, um zuerst die View zu erstellen. Ihr loadView ging davon aus, dass eine Ansicht vorhanden ist, und versuchte, eine Unteransicht hinzuzufügen. Dieser Zugriff führte dazu, dass der Ansichtscontroller loadView erneut aufruft.

Ein Override von loadView sollte self.view immer dem Bildschirm "some-view-that-fills-the-screen" zuweisen

Verwandte Themen