web-dev-qa-db-ja.com

ビュー階層からサブビューを削除して削除する正しい方法は何ですか?

いくつかのサブビューを持つ親UIViewがあります。定期的にサブビューを削除し、システムから完全に削除する必要があります。これを行う正しい方法は何ですか?私はこれを試しました:

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

[v removeFromSuperview];

そして奇妙な結果を得ました。以前に存在していたUIViewsも消えました。どうしたの?

38
dugla

これを試して:

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

UIViewクラスドキュメントで気づいたもう1つのこと-最後の文を参照してください。

removeFromSuperviewレシーバーをスーパービューとウィンドウからリンク解除し、レスポンダーチェーンから削除します。

  • (void)removeFromSuperview

ディスカッション受信者のスーパービューがゼロでない場合、このメソッドは受信者を解放します。ビューを再利用する場合は、このメソッドを呼び出す前にビューを保持し、作業が完了したら、または別のビュー階層に追加した後、適切にリリースするようにしてください。

表示中にこのメソッドを呼び出さないでください。

更新:2014年になり、サブビューを非表示にせずに削除しても完全に機能します。元のポスターのコードはそのまま動作するはずです:

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

これにより、vとサブビューとしてアタッチされたビューが削除され、containerViewとvの兄弟が残ります。

68
mahboudz

ビューからすべてのサブビューを削除するには:

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
    }
}
38
iKushal

Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag)
viewToRemove?.removeFromSuperview()
1
Alexey

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
JonJ
    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)

            }


       }
    }
0

Cell.contentViewに、削除するサブビューと同じタグがある可能性はありますか? ドキュメント viewWithTagによると、次のものが削除されます:

タグに一致する受信者の階層内のビュー。受信者は検索に含まれます。

この場合、セルからcell.contentViewを誤って削除している可能性があります。 nがゼロで、セルのcontentviewにタグが設定されていない場合、デフォルトで0になり、それが発生します。

0
Kevlar

それらは単にディスプレイから消えているのですか、それともディスプレイから消えているのですかおよびビュー階層ですか?デバッガーは何を示していますか?

0
NSResponder

それが正しい一般的な考え方です。消える他のUIView、このUIViewとの関係は何ですか?それらはこのビューのサブビューですか?削除しているビューのdeallocメソッドでdeallocされていますか?

タグは一意ですか?

スジャール

0
sujal