目标C:删除以前的ui元素

时间:2010-12-23 03:10:22

标签: objective-c arrays timer uibutton

我每秒都会制作一块“砖头”。当你点击它时它会消失。我的问题是,当屏幕上出现一秒钟或更长时间时,点击前一个会消除最新的一个,并且根本无法从屏幕上删除。我的代码是:

- (NSTimer *)getTimer{  
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:     @selector(produceBricks) userInfo:nil repeats:YES];
return timer;
}


-(IBAction) tapBrick {
//remove last brick
[bricks[count] removeFromSuperview];

//add to score
count++;
NSString *scoreString = [NSString stringWithFormat:@"%d", count];
score.text = scoreString;
}

-(void) produceBricks {
//determine x y coordinates
int xPos, yPos;
xPos = arc4random() % 250;
yPos = arc4random() % 370;

//create brick
bricks[count] = [[UIButton alloc] initWithFrame:CGRectMake(xPos,yPos + 60,70,30)];  
[bricks[count] setBackgroundColor:[UIColor blackColor]];
[bricks[count] addTarget:self action:@selector(tapBrick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:bricks[count]];


}

我知道它与bricks[count] removeFromSuperview行有关,计数总是在增加。我如何引用被点击的数组中的砖而不是当前的砖?

3 个答案:

答案 0 :(得分:2)

如果添加sender参数,它将自动设置为发送操作的控件,因此您可以执行以下操作:

-(IBAction) tapBrick:(id)sender {
    [sender removeFromSuperview];
}

答案 1 :(得分:1)

制作方法tapBrick:(UIButton *)brick,您将获得对被点击作为参数的砖的引用。

另外,我强烈建议不要使用C数组。这只是要求内存管理问题。最好使用NSMutableArray,并确保遵循memory management rules。使用您发布的代码,您的砖块对象将永远不会被释放,相反,它们只会继续占用内存,直到您的应用程序耗尽其供应。

答案 2 :(得分:0)

视图有一个tag属性是有原因的 - 所以你可以在同一个视图控制器中识别相同类型的视图。考虑为每个砖块设置一个唯一标签,然后删除您想要的特定标签。