Цель C: удаление предыдущих элементов пользовательского интерфейса - PullRequest
0 голосов
/ 23 декабря 2010

Я делаю "кирпич" каждую секунду. Когда вы нажимаете на него, он уходит. Моя проблема в том, что когда на экране появляется секунда или более, нажатие на предыдущую удаляет самую последнюю и не может быть удалено с экрана вообще. Код у меня есть:

- (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 ]

2 голосов
/ 23 декабря 2010

Если вы добавите аргумент sender, он автоматически будет установлен на элемент управления, который отправил действие, поэтому вы можете сделать что-то вроде следующего:

-(IBAction) tapBrick:(id)sender {
    [sender removeFromSuperview];
}
1 голос
/ 23 декабря 2010

Сделайте метод tapBrick:(UIButton *)brick, и вы получите ссылку на кирпич, который был использован в качестве аргумента.

Кроме того, я настоятельно не рекомендую использовать для этого массив C. Это просто требует проблем с управлением памятью. Лучше использовать NSMutableArray и обязательно соблюдать правила управления памятью . С кодом, который вы разместили, ваши кирпичные объекты никогда не будут освобождены, и вместо этого они будут просто потреблять память, пока ваше приложение не исчерпает свой запас.

0 голосов
/ 23 декабря 2010

Представления имеют свойство tag по причине - так что вы можете идентифицировать представления одного и того же типа в одном контроллере представления.Попробуйте установить уникальный тег для каждого из этих блоков, а затем удалить тот, который вам нужен.

...