2009-10-04 3 views
34

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

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

[v removeFromSuperview]; 

и получил странный результат. Ранее присутствовал UIView s исчез. Что происходит?

ответ

66

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

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

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

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

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

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

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

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

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

Это удалит V и любые мнения, он прилагается к нему в качестве подвидов, оставив позади containerView и любых братьев и сестер против.

+1

** зловещий ** Никогда не вызывать этот метод во время отображения. – Irwin

+0

не может быть проще, просто сделайте это, так как Blackberry говорит ** для (UIView * s в [view subviews]) [s removeFromSuperview]; ** – Fattie

+0

Еще в '09, если вы удалили подзаголовок, прежде чем скрывать его, вы получили некоторые странные результаты. Или, по крайней мере, это то, что я видел, и это был оригинальный плакат. И раньше было это предупреждение в ссылке класса UIView, которая была заменена другой. Я бы сказал, что метод оригинального плаката для удаления subview, вероятно, теперь корректен и не нуждается в дополнительном коде. (он просто удаляет одно подобие) – mahboudz

0

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

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

Sujal

+0

Все братья и сестры, которые я пытаюсь удалить, мгновенно исчезают с экрана. Что за? – dugla

+0

Все братья и сестры имеют уникальные теги, которые я называю видами. – dugla

0

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

0

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

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

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

38

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

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 
    } 
} 
+3

Мне нравится это лучше, чем принятый ответ. Это похоже на гораздо более прямой подход - и вы были довольно тщательно, включая варианты выбора того, что кто-то может захотеть удалить. +1. – GeneralMike

+0

hmm ... На самом деле, теперь, когда я пытался запустить это, он не работает. Я использую параметр isKindOfClass. У меня есть UILabels и UISliders в UIView, и я пытаюсь удалить все слайдеры, поэтому у меня есть: 'if ([subview isKindOfClass: [UISlider class]]); и он возвращает true для всего, включая метки, поэтому все удаляется. Я попытался заменить isKindOfClass на isMemberOfClass, и это тоже не сработает. Есть ли что-то особенное в UISliders, которое сделает это неработоспособным? – GeneralMike

+0

Выяснил свою проблему, у меня была опечатка, которая заставила меня навсегда найти. Код работает точно так, как показано здесь. – GeneralMike

1

Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag) 
viewToRemove?.removeFromSuperview() 
Смежные вопросы