问题
I'm looking for a simple method to remove at once all subviews from a superview instead of removing them one by one.
//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)
}
What I am missing?
UPDATE
My app has a main container_view
. I have to add different other views as subviews to container_view
in order to provide a sort of navigation.
So, when clicking the button to "open" a particular page, I need to remove allsubviews and add the new one.
UPDATE 2 - A working solution (OS X)
I guess Apple fixed it.
Now it is more easy than ever, just call:
for view in containerView.subviews{
view.removeFromSuperview()
}
回答1:
EDIT: (thanks Jeremiah / Rollo)
By far the best way to do this in Swift for iOS is:
view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array
^^ These features are fun!
let funTimes = ["Awesome","Crazy","WTF"]
extension String {
func readIt() {
print(self)
}
}
funTimes.forEach({ $0.readIt() })
//// END EDIT
Just do this:
for view in self.view.subviews {
view.removeFromSuperview()
}
Or if you are looking for a specific class
for view:CustomViewClass! in self.view.subviews {
if view.isKindOfClass(CustomViewClass) {
view.doClassThing()
}
}
回答2:
For iOS/Swift, to get rid of all subviews I use:
for v in view.subviews{
v.removeFromSuperview()
}
to get rid of all subviews of a particular class (like UILabel) I use:
for v in view.subviews{
if v is UILabel{
v.removeFromSuperview()
}
}
回答3:
The code can be written simpler as following.
view.subviews.forEach { $0.removeFromSuperview() }
回答4:
This should be the simplest solution.
let container_view: NSView = ...
container_view.subviews = []
(see Remove all subviews? for other methods)
Note this is a MacOS question and this answer works only for MacOS. It does not work on iOS.
回答5:
Try this:
for view in container_view.subviews {
view.removeFromSuperview()
}
回答6:
I don't know if you managed to resolve this but I have recently experienced a similar problem where the For loop left one view each time. I found this was because the self.subviews was mutated (maybe) when the removeFromSuperview() was called.
To fix this I did:
let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
subview.removeFromSuperview()
}
By doing .copy(), I could perform the removal of each subview while mutating the self.subviews array. This is because the copied array (subViews) contains all of the references to the objects and is not mutated.
EDIT: In your case I think you would use:
let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
view.removeFromSuperview()
}
回答7:
Extension for remove all subviews, it is quickly removed.
import Foundation
import UIKit
extension UIView {
/// Remove allSubView in view
func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
}
回答8:
Try this:
var subViews = parentView.subviews as Array<UIView>
for someView in subViews
{
someView.removeFromSuperview()
}
UPDATE: If you are feeling adventurous then you can make an extension on the UIView as shown below:
extension UIView
{
func removeAllSubViews()
{
for subView :AnyObject in self.subviews
{
subView.removeFromSuperview()
}
}
}
And call it like this:
parentView.removeAllSubViews()
回答9:
In xcodebeta6 this worked out.
var subViews = self.parentView.subviews
for subview in subViews as [UIView] {
subview.removeFromSuperview()
}
回答10:
I wrote this extension:
extension UIView {
func lf_removeAllSubviews() {
for view in self.subviews {
view.removeFromSuperview()
}
}
}
So that you can use self.view.lf_removeAllSubviews in a UIViewController. I'll put this in the swift version of my https://github.com/superarts/LFramework later, when I have more experience in swift (1 day exp so far, and yes, for API I gave up underscore).
回答11:
Your syntax is slightly off. Make sure you cast explicitly.
let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
for view in theSubviews {
view.removeFromSuperview()
}
回答12:
you have to try this
func clearAllScrollSubView ()
{
let theSubviews = itemsScrollView.subviews
for (var view) in theSubviews
{
if view is UIView
{
view.removeFromSuperview()
}
}
}
回答13:
Swift 3
If you add a tag to your view you can remove a specific view.
for v in (view?.subviews)!
{
if v.tag == 321
{
v.removeFromSuperview()
}
}
回答14:
For removing just subviews of a specific class - this was the only Swift code that worked for me in Xcode6.1.1. Assuming the only subviews you want to remove are of type UIButton...
for subView in nameofmysuperview.subviews {
if subView.isKindOfClass(UIButton) {
subView.removeFromSuperview()
}
}
回答15:
One-liner:
while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}
I think this approach is more readable than the "one-liners" using map or forEach. Short hand foreach and map can be difficult to understand, as the logic is more abstract.
回答16:
For Swift 3
I did as following because just removing from superview did not erase the buttons from array.
for k in 0..<buttons.count {
buttons[k].removeFromSuperview()
}
buttons.removeAll()
回答17:
Try this out , I tested this :
let theSubviews = container_view.subviews
for subview in theSubviews {
subview.removeFromSuperview()
}
回答18:
For Swift 4.+
extension UIView {
public func removeAllSubViews() {
self.subviews.forEach({ $0.removeFromSuperview() })
}
i hope this is use full for you.
回答19:
Swift 5.0
I create 2 different methods to remove subview. And it's much easier to use if we put them in 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() }
}
}
回答20:
did you try something like
for o : AnyObject in self.subviews {
if let v = o as? NSView {
v.removeFromSuperview()
}
}
来源:https://stackoverflow.com/questions/24312760/how-to-remove-all-subviews-of-a-view-in-swift