Подтвердить что ты не робот

Каков правильный способ удаления подвью из иерархии представлений и nuke?

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

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

[v removeFromSuperview];

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

4b9b3361

Ответ 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)

            }


       }
    }