self.viewからすべてのサブビューを削除する最良の方法は何ですか?


87

私は多分このような何かがうまくいくかもしれないと思っていました:

    for (UIView* b in self.view.subviews)
    {
       [b removeFromSuperview];
    }

あらゆる種類のサブビューを削除したい。UIImages、ボタン、テキストフィールドなど。


1
それはうまくいくでしょう。サブビューの層が複数ある場合は、再帰的に実行する必要があるかもしれません...またはそうでない場合もあります。何のためにこれをしたいのかわかりません。
ダスティン

それはうまくいきますか?それbはすぐにsubviews配列から削除され、高速列挙ループ内で突然変異を引き起こすと思いましたが、これは禁止されています。
mazyod 2012

2
@Mazyodチェックサブビュープロパティ:@property(nonatomic、readonly、copy)NSArray * subviews-コピーとして宣言されているため、サブビューを削除するときに、その配列を変更しません(コピーであるため)。
最大

1
@Max:それは正しくありません。copyそれはコピーを作成することを指定手段に設定する場合。取得については何も指定されていません。コピーが返される可能性は非常に高いですが、それはプロパティ定義の一部ではありません。
jscs 2012

@ W'rkncacnterは同意します、あなたはcopyキーワードが値を取得することとは何の関係もないということは正しいです(しかし私はそれが暗示されていると思います)。
最大

回答:


250
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

バリアントと同じですが、少し短くなっています。


これ以外はどうですか–同じ方法を使用しますか?@Mazyod
Hemang

makeObjectsPerformSelectorとサブビューを削除するための手動ループの間に(パフォーマンスによる)違いはありますか?
ガンパット2018年

22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Swiftの同一バージョン。


7

迅速:

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

1

このように使用できます

//adding an object to the view
view.addSubView(UIButton())

// you can remove any UIControls you have added with this code
view.subviews.forEach { (item) in
     item.removeFromSuperview()
}

ビューは、すべてを削除するビューです。forEachを実行してすべてのサブビューを削除しているだけです


あなたはあなたの答えを拡張できますか?
DᴀʀᴛʜVᴀᴅᴇʀ

これは、コレクションを反復処理しながらコレクションを変更しませんか?
mixtly87 2017年

0

Swift4 +の場合。に拡張子を付けることができUIViewます。必要に応じて呼び出してください。

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.