removeFromSuperview 无法正常工作

Posted

技术标签:

【中文标题】removeFromSuperview 无法正常工作【英文标题】:removeFromSuperview doesn't work properly 【发布时间】:2012-04-26 16:24:02 【问题描述】:

在课堂上

@interface StartScene : UIView

我调用一个实例

@interface HelpView : UIView 
    GameOverMenu* gorm;
    PlayScene* tView;

并使用addSubview。我这里也有大量代码

-(void) removemyself 
    [tView removeFromSuperview];
    [gorm removeFromSuperview];
    [self removeFromSuperview];


-(void)restartPlay 
    [tView removeFromSuperview];
    [self playSceneDidLoad];


-(void)gameOverDidLoad 
    [tView removeFromSuperview];
    gorm = [[GameOverMenu alloc]initWithFrame:CGRectMake(0, 0, 320, 520)];
    gorm.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backGround.jpg"]];
    [gorm checkScore:Scores];
    [self addSubview:gorm];


-(void)playSceneDidLoad 
    [gorm removeFromSuperview];
    tView = [[PlayScene alloc]initWithFrame:CGRectMake(0, 0, 320, 520)];
    tView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"backGround.jpg"]];
    [self addSubview:tView];
    [tView ooneFingerTwoTaps];

还有HelpView的两个子类:

@interface PlayScene : HelpView

@interface GameOverMenu : HelpView <UITextFieldDelegate>

StartScene 中,当我按下按钮时,会创建HelpView 的实例,并在init 方法中调用playSceneDidLoad

PlayScene 内部有一个调用restartPlay 方法的重启按钮。当游戏失败时,gameOverDidLoad 方法被调用。

PlaySceneGameOverMenu 中都有退出按钮,它调用removemyself 方法,应该让玩家返回主菜单。

乍一看它应该可以正常工作,但是如果我多次按下重新启动按钮而不是尝试按下退出,则会发生视图没有从超级视图中删除,现在只需按下退出按钮即可删除它们一。 我们停在 HelpView 上,它并没有自行删除(即使我尝试在某个地方调用 [super removeFromSuperview];

我需要及时正确地删除视图,并在按下退出时进入主菜单 (StartScene)。我不认为很多观点相互覆盖是一个好的变体。有什么问题?

【问题讨论】:

【参考方案1】:

好吧,我发现关键是如果从子类调用超类的方法并且有这样的命令[self removeFromSuperview];[(someOtherSubview) removeFromSuperview];,它是使用self 或(someOtherSubview)的子类。如果我们的子类没有指向的 subView,那么该命令将什么也不做。如果有[self removeFromSubview];,子类会自行移除。

实际上我通过使用按钮作为超类的子视图解决了这个问题。

【讨论】:

以上是关于removeFromSuperview 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

removeFromSuperview 随机崩溃

在多个窗口上处理视图 - 第二个窗口关闭时 removeFromSuperView 的问题

Swift:removefromSuperview 移除约束

出口集合 removefromsuperview

removeFromSuperview() 耗时过长

removeFromSuperview() 并不总是有效