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()
}
編集:(感謝エレミヤ/ 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()
}
}
IOS/Swiftの場合は、使用しているすべてのサブビューを削除します。
for v in view.subviews{
v.removeFromSuperview()
}
特定のクラス(UILabelなど)のすべてのサブビューを削除するには、次のようにします。
for v in view.subviews{
if v is UILabel{
v.removeFromSuperview()
}
}
コードは次のように簡単に書くことができます。
view.subviews.forEach { $0.removeFromSuperview() }
これが最も簡単な解決策です。
let container_view: NSView = ...
container_view.subviews = []
( すべてのサブビューを削除しますか?を参照 他の方法については==)
これはMacOSの質問であり、この答えはMacOSに対してのみ有効です。 iOSでは機能しません。
これを試して:
for view in container_view.subviews {
view.removeFromSuperview()
}
あなたがこれを解決できたかどうか私は知りませんが、私は最近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()
}
すべてのサブビューを削除するための拡張機能です。すばやく削除されます。
import Foundation
import UIKit
extension UIView {
/// Remove allSubView in view
func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
}
これを試して:
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()
Xcodebeta6ではこれはうまくいきました。
var subViews = self.parentView.subviews
for subview in subViews as [UIView] {
subview.removeFromSuperview()
}
私はこの拡張子を書きました:
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用)私はアンダースコアをあきらめた)。
これを試す必要があります
func clearAllScrollSubView ()
{
let theSubviews = itemsScrollView.subviews
for (var view) in theSubviews
{
if view is UIView
{
view.removeFromSuperview()
}
}
}
Swift
ビューにタグを追加すると、特定のビューを削除できます。
for v in (view?.subviews)!
{
if v.tag == 321
{
v.removeFromSuperview()
}
}
あなたの文法は少しずれています。明示的にキャストしてください。
let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
for view in theSubviews {
view.removeFromSuperview()
}
while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}
このアプローチはmapやforEachを使った "one-liners"より読みやすいと思います。論理がより抽象的であるため、foreachおよびmapと略記するのは、理解が難しい場合があります。
Swift 4.+
の場合
extension UIView {
public func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
私はこれがあなたのためにフルに使えることを願っています。
特定のクラスのサブビューだけを削除するために - これは私にとってXcode6.1.1で機能した唯一のSwiftコードです。削除したいサブビューのみがタイプIButton ...であると仮定します。
for subView in nameofmysuperview.subviews {
if subView.isKindOfClass(UIButton) {
subView.removeFromSuperview()
}
}
スイフト3用
スーパービューから削除しても配列からボタンが消えないため、次のようにしました。
for k in 0..<buttons.count {
buttons[k].removeFromSuperview()
}
buttons.removeAll()
これを試して、私はこれをテストしました:
let theSubviews = container_view.subviews
for subview in theSubviews {
subview.removeFromSuperview()
}
サブビューを削除する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() }
}
}