Как правильно удалить подпредставление из иерархии представлений и уничтожить его? - PullRequest
38 голосов
/ 04 октября 2009

У меня есть родительский UIView с несколькими подпредставлениями. Периодически мне нужно удалить подпредставление и полностью удалить его из системы. Как правильно это сделать? Я попробовал это:

UIView *v = [self.containerView viewWithTag:[n integerValue]];

[v removeFromSuperview];

и получил причудливый результат. Предыдущие UIView s также исчезли. Что происходит?

Ответы [ 7 ]

68 голосов
/ 06 октября 2009

Попробуйте это:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
v.hidden = YES;
[self.containerView bringSubviewToFront:v];
[v removeFromSuperview];

Еще одна вещь, которую я только что заметил из документа класса UIView - см. Последнее предложение:

removeFromSuperview Отсоединяет получателя от его суперпредставления и его окна и удаляет его из цепочки респондента.

  • (аннулируются) removeFromSuperview

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

Никогда не вызывайте этот метод при отображении.

ОБНОВЛЕНИЕ: сейчас 2014 год, и удаление подпредставления без его скрытия работает отлично. Оригинальный код плаката должен работать как есть:

UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];

Это приведет к удалению v и любых представлений, которые он прикрепил к нему как подпредставления, оставляя позади ContainerView и любые родственные элементы v.

38 голосов
/ 03 августа 2012

Чтобы удалить все подпредставления из вашего представления:

for(UIView *subview in [view subviews]) {
   [subview removeFromSuperview];
}

Если вы хотите удалить только определенное представление, то:

for(UIView *subview in [view subviews]) {
  if([subview isKindOfClass:[UIButton class]]) {
     [subview removeFromSuperview];
 } else {
     // Do nothing - not a UIButton or subclass instance
 }
}

Вы также можете удалить дополнительные просмотры по значению тега:

for(UIView *subview in [view subviews]) {
    if(subview.tag==/*your subview tag value here*/) {
        [subview removeFromSuperview];

    } else {
        // Do nothing - not a UIButton or subclass instance
    }
}
1 голос
/ 14 марта 2017

Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
0 голосов
/ 21 июня 2018

Swift 4: продлить UIView

extension UIView {
    public func removeAllSubviews() {
        for subview in self.subviews {
            subview.removeFromSuperview()
        }
    }
}

или

extension UIView {
    public func removeAllSubviews() {
        self.subviews.forEach { $0.removeFromSuperview() }
    }
}
0 голосов
/ 06 октября 2009

Возможно ли, что cell.contentView имеет тот же тег, что и подпредставление, которое вы хотите удалить? в соответствии с документацией viewWithTag удаляет:

Представление в иерархии получателя это соответствует тегу. Приемник включены в поиск.

Если это так, то вы можете случайно удалить cell.contentView из ячейки. Если n равно нулю и тэг contentview вашей ячейки не имеет установленного тега, он по умолчанию будет равен 0, что приведет к этому.

0 голосов
/ 04 октября 2009

Они просто исчезают с дисплея или исчезают с дисплея и иерархия представления? Что показывает вам отладчик?

0 голосов
/ 04 октября 2009

Это правильная общая идея. те другие UIViews, которые исчезают, как они связаны с этим UIView? Являются ли они подпредставлениями этого взгляда? Являются ли они dealloc'd в методе dealloc вида, который вы удаляете?

Вы уверены, что ваши теги являются уникальными?

Sujal

...