我有一个名为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推到正确的位置,但这只是猜测。
答案 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分配给某些视图,即填充屏幕