Удалить все экземпляры из суперпредставления - PullRequest
1 голос
/ 12 января 2012

Я пытаюсь удалить все спрайты (UIImageViews) на моем экране с помощью следующего кода:

-(IBAction)clearAll:(id)sender{
      for (Sprite *sprite in self.view.subviews){
      [sprite removeFromSuperview];
}

Однако при запуске этого кода элементы из моей раскадровки, которые НЕ являются спрайтами, удаляются.На самом деле, все в представлении в значительной степени удалено.

Что происходит?

Ответы [ 4 ]

3 голосов
/ 12 января 2012

Это не так, как в циклах.То, что вы указали тип, не означает, что будут затронуты только объекты этого типа.Каждое представление в subviews отвечает на removeFromSuperview, поэтому независимо от того, как оно было отлито, оно все равно будет удалено.

Если вы хотите удалить только Sprite объекты, тогда вам нужнопроверьте класс каждого объекта.

for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[Sprite class]])
        [view removeFromSuperview];
}
1 голос
/ 21 декабря 2012

Мы можем удалить все экземпляры типов UIView из его SuperView, используя следующую инструкцию.

[[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

Это выглядит чище, проще, чем делать цикл.

1 голос
/ 12 января 2012

В этом случае подпредставления содержат все (спрайты и другие объекты).Ваше перечисление не только возвращает спрайты - оно возвращает все (но слабо «отбрасывает» их как спрайты).В этом случае все, что является подпредставлением, реагирует на метод removeFromSuperview - так что все удаляется.

Вам необходимо проверить тип объекта при циклическом просмотре подпредставлений, чтобы определить, нужно ли его удалять.

0 голосов
/ 12 января 2012

Ваш код вызывает removeFromSuperview во всех подпредставлениях self.view и поэтому работает правильно, как написано.Причина, по которой этот код выполняется, заключается в том, что Sprite, вероятно, является подклассом UIView, поэтому компилятор не выдает ошибку / не предупреждает вас.Что вам нужно сделать, это больше похоже на это:

-(IBAction)clearAll:(id)sender{
    for (UIView *aSubview in self.view.subviews){
    if ([aSubview isSubclassOf
    [sprite removeFromSuperview];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...