从superview中移除导致我的应用程序崩溃

5
我很确定这只是一个愚蠢的错误,但在过去的一个小时里我一直试图从我的父视图中移除子视图却没有成功。
在我的第一个视图上,我有:
UIViewController *helpView = [[[UIViewController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease];
[self.view addSubview:helpView.view];

然后在helpView中,我有一个按钮,连接到一个名为“closeHelp”的IBAction,它只执行以下操作:

- (IBAction) closeHelp{
    [self.view removeFromSuperview];
}

但是由于某种奇怪的原因,这会导致我的应用程序崩溃并出现EXC_BAS_ACCESS错误,即使这是在HelpView内部,意味着self.view应该指向正确的子视图。希望你能帮忙解决这个问题。
谢谢。 Shai.

你在哪个类中有'-closeHelp'这个方法?在Interface Builder中它是否被正确地连接起来了?你是否已经将HelpView.xib文件中的类设置为该类? - Eiko
5个回答

5

如同Andreas所回答的,您正在尝试从其父视图中删除self.view。 您基本上需要从其父视图中删除helpView。

因此应该是这样的:

- (IBAction) closeHelp{
    [helpView removeFromSuperview];
}

但是我们不知道上面的方法中的 "helpView" 是什么。因为我们没有对它进行任何处理。

所以我们的代码最终应该像这样。

#define HELP_VIEW_TAG 101 // Give tag of your choice

HelpView *helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil];
helpView.view.tag = HELP_VIEW_TAG;
[self.view addSubview:helpView.view];
[helpView release];

- (IBAction) closeHelp{
    UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG];
    [helpView removeFromSuperview];
}

嘿,谢谢!我尝试了这个解决方案,但现在子视图甚至都不会加载...(EXC_BAD_ACCESS)UIViewController *helpView = [[[UIViewController alloc] initWithNibName:@"HelpView" bundle:nil] autorelease]; helpView.view.tag = HELP_VIEW_TAG; [self.view addSubview:helpView.view]; [helpView release]; - Shai Mishali
@Shai Mishali,你的声望已经足够了。来到房间里讨论一下吧。在这里要避免扩展评论线程。 - user745098
我已经足够了,它也显示我足够了(“恭喜,你获得了特权——在聊天中说话和其他 5 种特权。了解更多”),但当我进入聊天时,它仍然只显示“你需要20”,即使我已经有了它...很奇怪。 - Shai Mishali
我建议您添加环境变量NSZombieEnabled(在项目->“编辑活动可执行文件”中),并将其设置为YES,以跟踪启动问题的对象。 - Mat
目前这个程序可以运行,唯一的问题是我不确定在哪里释放对象——我可以在homeview的dealloc中释放它,但如果我能在HelpView的dealloc中释放它会更好...希望我能直接进入聊天,但对我来说有些bug... - Shai Mishali
显示剩余14条评论

2

self.view并不指向您的子视图,而是指向您的uiviewcontroller管理的根视图。您应该只删除子视图堆栈中的最后一个对象,而不是整个视图,因为现在您正在删除整个帮助视图。

无论如何,为什么不以模态方式呈现视图控制器,而不是这样做呢?

[self presentModalViewController:helpView animated:NO/YES];

helpView. modalTransitionStyle = //One of the constants below

UIModalTransitionStyleCoverVertical
UIModalTransitionStyleFlipHorizontal
UIModalTransitionStyleCrossDissolve
UIModalTransitionStylePartialCurl

通常我会在将以模态方式呈现的视图控制器中写下 self.modalTransitionStyle = // 常量之一,而不是分散代码。

这个方法无论如何都应该属于HelpViewController类,而且最后一句话在这里没有意义。如果你想修改视图层次结构,你的视图必须被加载,self.view是适当的引用视图的方式。 - Eiko

1

您正在将helpView初始化为UIViewController
请确保在初始化它的视图控制器的.h文件中导入了#import "HelpView.h"(或者是helpView .h文件的名称)。

然后,使用以下代码:

HelpView *helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil];
[self.view addSubview:helpView.view];

那应该就解决了。


他在代码中基本上是试图将self.view从其父视图中移除,这可能应该是nil。 - user745098

0
最终对我来说最简单的解决方案是将我的XIB文件的所有者定义为与父控制器相同的类,这意味着父控制器将控制父视图和子视图,这样做会更加容易。 :)

-1
Declare the help view on calss level.

in.h file 

@class HelpView;
..
@interface
{
HelpView *helpView;
}
@property(nonatomic,retain)HelpView*  helpView;


In.m file 
#import "HelpView"
@synthensize helpView;



now add this Code where you want 

helpView = [[HelpView alloc] initWithNibName:@"HelpView" bundle:nil];
helpView.view.tag = HELP_VIEW_TAG;
[self.view addSubview:helpView.view];


- (IBAction) closeHelp{
    //UIView *helpView = [self.view viewWithTag:HELP_VIEW_TAG];
    [helpView removeFromSuperview];
}

-(void)dealloc { [helpView release]; }

-(void)dealloc { [helpView release]; }


在父 dealloc 方法中还是 helpview dealloc 方法中释放?我猜测是父类。 - Shai Mishali
在这个文件的 .m 中添加 -(void)dealloc{ [helpView release] }。 - dark
为视图控制器添加委托并没有太大的意义,这会让初学者感到困惑。;P - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接