点击栏按钮时删除子视图

时间:2013-03-05 06:02:05

标签: ios

我试图在点击一个条形按钮时触发添加两个子视图。但添加子视图效果很好,但是当我尝试删除子视图时,它不起作用。

这是我正在实施的代码

-(IBAction)showPopover:(id)sender{

    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 

    UIView *popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1000)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
    if (popoverCount == 0) {
        [self.view addSubview:popoverViewBackground];
        [self.view addSubview:popoverView];
        popoverCount = 1;
    }else if (popoverCount ==1){
        [popoverView removeFromSuperview];
        [popoverViewBackground removeFromSuperview];
        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];    
}

4 个答案:

答案 0 :(得分:3)

问题是,每次单击按钮时都要创建新视图,因此旧视图不会删除像你这样的代码,然后它会正常工作。我已经测试过了。

<。>文件中的

@interface secondViewController : UIViewController
{

    int popoverCount;

    UIView *popoverView ;

    UIView *popoverViewBackground;
}
<。>文件中的

- (void)viewDidLoad
{
    [super viewDidLoad];


    popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, -100, 320, 100)];

    popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, -100, 320, 100)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
}

-(IBAction)showPopover:(id)sender {

                if (popoverCount == 0) {
        [self.view addSubview:popoverViewBackground];

        [self.view addSubview:popoverView];

                [UIView animateWithDuration:0.5
                                 animations:^{
                                     popoverView.frame = CGRectMake(0,0,320,100);
                                 }
                                 completion:^(BOOL finished){
                                     ;
                                 }];
                [UIView animateWithDuration:0.5
                                 animations:^{
                                     popoverViewBackground.frame = CGRectMake(0,0,320,100);
                                 }
                                 completion:^(BOOL finished){
                                     ;
                                 }];
        popoverCount = 1;
    }else if (popoverCount ==1){


        [UIView animateWithDuration:0.5
                         animations:^{
                             popoverView.frame = CGRectMake(0,-100,320,100);
                         }
                         completion:^(BOOL finished){
                              [popoverView removeFromSuperview];
                         }];
        [UIView animateWithDuration:0.5
                         animations:^{
                             popoverViewBackground.frame = CGRectMake(0,-100,320,100);
                         }
                         completion:^(BOOL finished){
                             [popoverViewBackground removeFromSuperview];
                         }];


        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];   

}

答案 1 :(得分:0)

UIView *popoverView;
UIView *popoverViewBackground;

在.h文件中声明popoverView和popoverViewBackground,并在popoverCount为零时分配和初始化这些子视图。

-(IBAction)showPopover:(id)sender{


    if (popoverCount == 0) {
    popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 

    popoverViewBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1000)];
    popoverView.alpha = 0.0;
    popoverView.layer.cornerRadius = 2;
    popoverView.layer.borderWidth = 0.1f;
    popoverView.layer.backgroundColor = [UIColor whiteColor].CGColor;
    popoverView.layer.masksToBounds = YES;

    popoverViewBackground.layer.backgroundColor= [UIColor blackColor].CGColor;
        [self.view addSubview:popoverViewBackground];
        [self.view addSubview:popoverView];
        popoverCount = 1;
    }else if (popoverCount ==1){
        [popoverView removeFromSuperview];
        [popoverViewBackground removeFromSuperview];
        popoverCount = 0;
    }
    [popoverViewBackground setAlpha:0.5];
    [popoverView setAlpha:1.0];    
}

答案 2 :(得分:0)

代码中至少有2个问题:

  1. 每次涉及该方法时,您都在创建这些子视图的新实例
  2. 您正在删除新创建的实例。也就是说,之前添加的实例仍然存在。
  3. 你应该

    • 将这些子视图保存在实例变量中,以便您可以引用它们并正确删除它们。
    • 将创建代码移到第一个if-block中,这样就不会创建太多的子视图。

答案 3 :(得分:0)

这是因为你在不同的对象上应用addSubview和removeFromSuperview。

当第一次调用showPopover时,它会创建两个UIView对象 名称为popoverView和popoverViewBackground。
并将其添加到self.view。

直到现在每件事都很好但是当这个方法第二次打电话时 再次创建popoverView和popoverViewBackground的新对象和
您正试图从self.view中删除那个新创建的对象,而不是那里。

如何解决这个问题:

有两种方法可以解决这个问题:

1)在.h文件中创建此对象,以便您可以从任何地方访问它。

2)以第一次方法调用时创建的方式创建对象。 提供此UIView标记,当您删除在UIView.subview

中找到此标记时

方式1是简单的方法2需要一些代码,但你可以使它在内存的高效率。

一切顺利