使用presentModalViewController添加视图

问题描述:

我有一个名为TripViewController的UIViewController子类。这个类有下面的方法:使用presentModalViewController添加视图

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

LockOverlay也是UIViewController子类,定义如下(该代码的其余部分仅仅是自动生成的存根):

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

当LOCKSCREEN被调用,该程序进入无限循环,并且loadView被反复调用。

那么,我在这里做错了什么?我之前有过这样的错误......在App Delegate中,我创建了一个TabBarController,其中一个视图有一个NavigationController。当我尝试将View而不是NavigationViewController添加到tabBar数组时,我得到了同样的错误。我认为这个问题是相似的,我并没有把新的ViewController推到正确的位置,但这只是一个猜测。

我改变loadView为initWithFrame并返回自我。它现在有效。

[self.view addSubview:slider]; 

你应该有类似

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

这是因为self.view还不存在......那是什么的loadView是!它被记录在UIViewController文档中,视图属性的实现是在访问(vs分配)时,到目前为止它是零,它调用loadView来首先创建视图。你的loadView假设一个视图存在,并试图添加一个子视图,该访问导致视图控制器再次调用loadView。

loadView的覆盖应该始终将self.view分配给某些视图即填充屏幕