为什么每当加载此视图时,以下程序都会使我的应用程序崩溃?
-(void)loadView {
UIButton *chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure] retain];
[chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside ];
chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
[self.view addSubview:chooseSubjectButton];
}
如有任何帮助,我们将不胜感激。
谢谢!
我的猜测是,你的应用程序实际上并没有崩溃。它只是不断重复调用loadView
方法,因为您错过了加载视图的机会。调用[super loadView]
或创建一个视图并将其分配为self.view
,然后再向self.view添加任何内容。最方便的方法是使用[super loadView]
。
- (void)loadView {
[super loadView];
// Your Code Here
}
编辑:这个答案看起来是错误的。请考虑访问是否可以拨打〔super-loadView〕?正如@Denis Vert在评论中指出的那样。
@Simon指出您缺少[super loadView]
,这引发了另一个问题。
您正在将此viewController与关联的.xib文件一起加载吗?如果是这样的话,您可能是想在-viewDidLoad
而不是-viewLoad
中执行此操作。
只是一个想法,因为我过去对此感到困惑。
好吧,这里已经给出的答案有点混乱。。。
首先,您不调用[super loadView];
是正确的,请参阅- (void)loadView
:
如果为了手动创建视图而重写此方法,则应执行此操作,并将层次结构的根视图指定给视图属性。(您创建的视图应该是唯一的实例,不应该与任何其他视图控制器对象共享。)此方法的自定义实现不应该调用super。
如果您真的想使用loadView
(即以编程方式创建视图,而不是从NIB创建视图),那么在您的实现中,必须分配控制器的view
属性。
此外,您不需要保留按钮的使用方式,因为您将其添加为主视图的子视图(之后您的主视图将拥有它)。
基于这些考虑,您的方法如下所示:
-(void)loadView {
CGRect frame = [[UIScreen mainScreen] applicationFrame]; // adjust to your needs
UIView *rootView = [[UIView alloc] initWithFrame:frame];
UIButton *chooseSubjectButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
[chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside];
[rootView addSubview:chooseSubjectButton];
self.view = rootView;
[rootView release];
}
当然,如果使用NIB来定义根视图,则需要覆盖-viewDidLoad:
以进行其他配置。
希望这能有所帮助。
尝试将该代码放入viewDidLoad
中。初始化代码可以创建无限堆栈跟踪。尽管我不确定创建该按钮是否会引发崩溃。
如果我错了,任何人都可以纠正我
看看这个:iPhone SDK:loadView和viewDidLoad之间有什么区别?
-(void)loadView{[super-loadView];UIButton*chooseSubjectButton=[[UIButton buttonWithType:UIButtonTypeDetailDisclosure]retain];[chooseSubjectButton addTarget:self-action:@selector(chooseSubject)forControlEvents:UIControlEventTouchUpInside];chooseSubjectButton.frame=CGRectMake(15.0f、205.0f、296.0f、51.0f);[self.view addSubview:chooseSubjectButton];}
希望这能帮助
对于其他阅读此线程的人来说,Octy说你永远不应该调用[super-loadView]是正确的。我在这个页面上读到了一些关于它的争论。阅读Octy的回答中发布的文档,在第28页,它明确指出你不应该调用这个方法。甚至还解释了原因。这样做将使用默认名称(与类名相同)查找笔尖。即使这个笔尖不存在,它也是在浪费处理能力。只需创建一个新的UIView并将其设置为self.view即可
只是想确保未来的读者知道这一点。我花了一段时间才弄明白。
由于您在loadView中引用self.view,因此会得到一个无限循环。当您调用self.view,而self.view为nil时,它将导致再次调用loadView。正在创建循环。
如果你调用[super-loadView],它会初始化self.view,这样你就不会看到问题了。
所以,实例化self-view自己,你就会好起来的。
希望这能有所帮助。