web-dev-qa-db-ja.com

Swiftでビューのすべてのサブビューを削除する方法

1つずつ削除するのではなく、スーパービューからすべてのサブビューを一度に削除する簡単な方法を探しています。

//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
    view.removeFromSuperview(container_view)
}

何が足りないの?

UPDATE

私のアプリはメインのcontainer_viewを持っています。私はある種のナビゲーションを提供するためにcontainer_viewにサブビューとして他の異なるビューを追加しなければなりません。

そのため、ボタンをクリックして特定のページを「開く」ときは、すべてのサブビューを削除して新しいページを追加する必要があります。

PDATE 2 - 実用的な解決策(OS X)

私はAppleがそれを直したと思います。

これで今まで以上に簡単になりました。

for view in containerView.subviews{
    view.removeFromSuperview()
}
148
Alberto Bellini

編集:(感謝エレミヤ/ Rollo)

Swift for iOSでこれを行う最も良い方法は、次のとおりです。

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array

^^これらの機能は楽しいです!

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })

////終了編集

これをしてください。

for view in self.view.subviews {
    view.removeFromSuperview()
}

またはあなたが特定のクラスを探しているなら

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }
302
Bseaborn

IOS/Swiftの場合は、使用しているすべてのサブビューを削除します。

for v in view.subviews{
   v.removeFromSuperview()
}

特定のクラス(UILabelなど)のすべてのサブビューを削除するには、次のようにします。

for v in view.subviews{
   if v is UILabel{
      v.removeFromSuperview()
   }
}
34
tonethar

コードは次のように簡単に書くことができます。

view.subviews.forEach { $0.removeFromSuperview() }
29
mishimay

これが最も簡単な解決策です。

let container_view: NSView = ...
container_view.subviews = []

すべてのサブビューを削除しますか?を参照 他の方法については==)


これはMacOSの質問であり、この答えはMacOSに対してのみ有効です。 iOSでは機能しません。

16
Sulthan

これを試して:

for view in container_view.subviews {
    view.removeFromSuperview()
}
9
MattL

あなたがこれを解決できたかどうか私は知りませんが、私は最近Forループが毎回一つのビューを去るという同様の問題を経験しました。これは、removeFromSuperview()が呼び出されたときにselfsubviewsが変更された可能性があるためです。

これを修正するために私はしました:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

.copy()を実行することで、self.subviews配列を変更しながら各サブビューの削除を実行できます。これは、コピーされた配列(subViews)にオブジェクトへのすべての参照が含まれており、変更されていないためです。

編集:あなたのケースでは私はあなたが使用すると思います:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}
9
Adam Richards

すべてのサブビューを削除するための拡張機能です。すばやく削除されます。

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}
8
YannSteph

これを試して:

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

UPDATE:冒険好きなら、以下に示すようにUIViewで拡張することができます。

extension UIView
{
    func removeAllSubViews()
    {
       for subView :AnyObject in self.subviews
       {
            subView.removeFromSuperview()
       }
    }

}

そしてこれを次のように呼ぶ:

parentView.removeAllSubViews()
6
azamsharp

Xcodebeta6ではこれはうまくいきました。

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }
5
hatebyte

私はこの拡張子を書きました:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}

UIViewControllerでself.view.lf_removeAllSubviewsを使用できるようにするためです。私はこれをSwift版の私の https://github.com/superarts/LFramework に入れます。Swiftでもっと経験があるとき(これまでの1日の経験、そしてはい、API用)私はアンダースコアをあきらめた)。

3
superarts.org

これを試す必要があります

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}
2
Ahmed Zaytoun

Swift

ビューにタグを追加すると、特定のビューを削除できます。

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }
2
uplearnedu.com

あなたの文法は少しずれています。明示的にキャストしてください。

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }
2
Jack

ワンライナー:

while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}

このアプローチはmapforEachを使った "one-liners"より読みやすいと思います。論理がより抽象的であるため、foreachおよびmapと略記するのは、理解が難しい場合があります。

1
eonist

Swift 4.+の場合

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

私はこれがあなたのためにフルに使えることを願っています。

1
Masoud Heydari

特定のクラスのサブビューだけを削除するために - これは私にとってXcode6.1.1で機能した唯一のSwiftコードです。削除したいサブビューのみがタイプIButton ...であると仮定します。

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}
1
gammachill

スイフト3用

スーパービューから削除しても配列からボタンが消えないため、次のようにしました。

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()
1
Hope

これを試して、私はこれをテストしました:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }
1
Ezimet

Swift 5.0

サブビューを削除する2つの異なるメソッドを作成します。そして、それらをextensionに入れると、はるかに使いやすくなります。

extension UIView {
    /// Remove all subview
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }

    /// Remove all subview with specific type
    func removeAllSubviews<T: UIView>(type: T.Type) {
        subviews
            .filter { $0.isMember(of: type) }
            .forEach { $0.removeFromSuperview() }
    }
}
0
nahung89