removeFromSuperview导致我的应用程序崩溃

时间:2011-07-09 08:11:34

标签: iphone crash exc-bad-access subview superview

我确定这是一个愚蠢的错误,但我正在尝试过去一小时从我的超级视图中删除子视图而没有任何成功。

在我的第一个视图中我有

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

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

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

但这会导致我的应用程序因EXC_BAS_ACCESS崩溃而出于一些奇怪的原因,即使是在HelpView内部,也就是说self.view应该指向正确的子视图。

非常感谢您的帮助

谢谢。
晒。

5 个答案:

答案 0 :(得分:5)

正如安德烈亚斯回答的那样,您正试图从超级/父级视图中删除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];
}

答案 1 :(得分:2)

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

无论如何,为什么不以模态方式呈现viewcontroller而不是这样做呢?

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

helpView. modalTransitionStyle = //One of the constants below

UIModalTransitionStyleCoverVertical
UIModalTransitionStyleFlipHorizontal
UIModalTransitionStyleCrossDissolve
UIModalTransitionStylePartialCurl

通常我在写self.modalTransitionStyle = // One of the constants 在viewcontroller中将以模态方式呈现,而不是传播代码。

答案 2 :(得分:1)

您正在将helpView初始化为UIViewController 确保在初始化它的视图控制器的#import "HelpView.h"文件中有.h(或者调用了helpView .h文件)。

然后,使用此代码:

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

那应该解决它。

答案 3 :(得分:0)

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

答案 4 :(得分:-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];
}

- (无效)的dealloc { [helpView发布]; }