微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建UIButton时,iPhone App在loadView方法中崩溃

如何解决创建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] 举报,一经查实,本站将立刻删除。