Каков правильный способ удаления подвью из иерархии представлений и nuke?
У меня есть родительский UIView с несколькими подзонами. Периодически мне нужно удалить subview и полностью удалить его из системы. Каков правильный способ сделать это? Я пробовал это:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
и получил странный результат. Ранее присутствовавший UIView
также исчез. Что происходит?
Ответы
Ответ 1
Попробуйте следующее:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
v.hidden = YES;
[self.containerView bringSubviewToFront:v];
[v removeFromSuperview];
Еще одна вещь, которую я только что заметил из документа класса UIView - см. последнее предложение:
removeFromSuperview
Отключает приемник от его супервизора и его окна и удаляет его из цепочки ответчиков.
- (пустоты) removeFromSuperview
Обсуждение
Если супервизор приемников не равен нулю, этот метод освобождает приемник. Если вы планируете повторно использовать представление, обязательно сохраните его перед вызовом этого метода и обязательно отпустите его по мере необходимости, когда вы закончите с ним, или после добавления его в другую иерархию представлений.
Никогда не вызывать этот метод во время отображения.
UPDATE: теперь 2014 год и удаление подзаголовка, не скрывая его, отлично работает. Исходный код плаката должен работать как есть:
UIView *v = [self.containerView viewWithTag:[n integerValue]];
[v removeFromSuperview];
Это приведет к удалению v и любых представлений, которые он привязал к нему, как к подзонам, оставив позади containerView и любых братьев и сестер v.
Ответ 2
Чтобы удалить все просмотры из вашего представления:
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
Swift 3.0:
let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
Ответ 4
Это правильная общая идея. те другие UIViews, которые исчезают, каковы их отношения к этому UIView? Подходят ли они к этой точке зрения? Удалены ли они из метода dealloc вида, который вы удаляете?
Вы уверены, что ваши тэги уникальны?
Sujal
Ответ 5
Они просто исчезают с экрана или исчезают с дисплея и иерархии представлений? Что показывает вам отладчик?
Ответ 6
Возможно ли, что cell.contentView имеет тот же самый тег, что и subview, который вы хотите удалить? в соответствии с documentation viewWithTag удаляет:
Вид в иерархии приемников который соответствует тегу. Приемник включен в поиск.
Если это так, вы можете случайно удалить cell.contentView из ячейки. Если n равно нулю, и для вашего содержимого содержимого ячеек нет установленного для него тега, он будет по умолчанию равным 0 и приведет к тому, что это произойдет.
Ответ 7
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() }
}
}
Ответ 8
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
if let topController = UIApplication.topViewController() {
if topController.isKind(of: ProviderHome.self)
{
let arrOfSuview = self.view.subviews
if arrOfSuview.count > 1
{
print("Davender Arr of subviews : \(arrOfSuview)")
for i in 0..<arrOfSuview.count
{
let objSub = arrOfSuview[i]
if objSub.tag == 101
{
objSub.removeFromSuperview()
}
}
}
NotificationCenter.default.addObserver(self, selector: #selector(ProviderHome.handelPushNotification), name: NSNotification.Name(rawValue: "handelPush"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ProviderHome.handelLocalNotification), name: NSNotification.Name(rawValue: "handelLocal"), object: nil)
}
}
}
@objc func handelPushNotification(_ notification: NSNotification) {
let arrOfSuview = self.view.subviews
if arrOfSuview.count > 1
{
print("Davender Arr of subviews : \(arrOfSuview)")
for i in 0..<arrOfSuview.count
{
let objSub = arrOfSuview[i]
if objSub.tag == 101
{
objSub.removeFromSuperview()
}
}
}
if notification.userInfo != nil
{
let dict = notification.userInfo as! Dictionary<String, Any>
let d = dict["data"] as! Dictionary<String, Any>
let action = d["gcm.notification.label"] as! String
print("current message id :- ", action)
self.getNotificationId = action
if getNotificationId != ""
{
//call the api for getting Data
AppDelegate.sharedInstance().myCurrentnotificationId = getNotificationId
//working code
let storyboard = UIStoryboard(name: "Provider", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "CommonPopUpsVC") as! CommonPopUpsVC
vc.modalPresentationStyle = .overFullScreen
vc.view.frame = self.view.frame
vc.view.tag = 101
self.view.addSubview(vc.view)
self.present(vc, animated: true, completion: nil)
}
}
}