如何解决创建UIButton时,iPhone App在loadView方法中崩溃
| 为什么每次加载此视图后,以下应用程序都会崩溃?-(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
方法,因为您错过了加载视图的时间。在向self.view添加任何内容之前,调用2ѭ或创建一个视图并将其分配为self.view
。方便的方法是使用[super loadView]
。
- (void)loadView {
[super loadView];
// Your Code Here
}
编辑:这个答案看起来是错误的。请考虑访问可以调用[super loadView]吗?正如@Denis Vert在评论中指出的那样。
, @Simon指出您缺少[super loadView]
引发了另一个问题。
您是否正在使用关联的.xib文件加载此viewController?如果是这样,您可能打算用-viewDidLoad
而不是-viewLoad
这样做。
只是一个想法,因为过去我对此一直感到困惑。
, 好的,这里已经给出的答案有很多混乱...
首先,您正确地不叫[super loadView];
,请参阅- (void)loadView
:
如果覆盖此方法以便手动创建视图,则应这样做,并将层次结构的根视图分配给view属性。 (您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。)此方法的自定义实现不应调用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定义根视图,则需要覆盖ѭ14进行其他配置。
希望这可以帮助。
, 尝试将代码放在ѭ15中。初始化代码可以创建无限的堆栈跟踪。尽管我不确定创建该按钮是否会触发崩溃。
如果我错了,任何人都可以纠正我
看到这个:iPhone SDK:loadView和viewDidLoad有什么区别?
,
-(无效)loadView
{
[super loadView];
UIButton * chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure]保留];
[chooseSubjectButton addTarget:self动作:@selector(chooseSubject)forControlEvents:UIControlEventTouchUpInside];
choiceSubjectButton.frame = CGRectMake(15.0f,205.0f,296.0f,51.0f);
[self.view addSubview:chooseSubjectButton];
}
希望这可以帮助
, 仅对于其他阅读此线程的人来说,Octy正确地说您永远不要调用[super loadView]。我已经在此页上阅读了一些辩论。阅读Octy's答案中发布的文档,第28页,其中明确指出您不应调用此方法。甚至说明了原因。这样做将使用默认名称(与类名相同)查找笔尖。即使此笔尖不存在,也浪费了处理能力。只需创建一个新的UIView并将其设置为self.view。 (请参见本页上的示例)
只是想确保将来的读者知道这一点。花了我一段时间才能弄清楚。
, 由于在loadView中引用了self.view,因此出现了无限循环。当您调用self.view并且self.view为nil时,它将导致再次调用loadView。创建循环。
如果调用[super loadView],它将初始化self.view,所以您看不到问题。
因此,实例化self.view自己,一切都会好起来的。
希望这可以帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。