目标c-iPhone应用程序在创建UIButton时在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方法,因为您错过了加载视图的机会。调用[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自己,你就会好起来的。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新