使用presentModalViewController添加视图

时间:2009-07-18 22:22:53

标签: iphone cocoa-touch

我有一个名为TripViewController的UIViewController子类。该类有以下方法:

- (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。

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

2 个答案:

答案 0 :(得分:0)

我将loadView更改为initWithFrame并返回self。它现在有效。

答案 1 :(得分:0)

[self.view addSubview:slider];

你应该有像

这样的东西
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];

这是因为self.view还不存在......这就是loadView的用途!在UIViewController文档中记录了view属性的实现是,当访问(vs assign)并且到目前为止它是nil时,它首先调用loadView来创建视图。您的loadView假设视图存在并尝试添加子视图,该访问导致视图控制器再次调用loadView。

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