Remove all subviews?

前端 未结 15 1609

When my app gets back to its root view controller, in the viewDidAppear: method I need to remove all subviews.

How can I do this?

相关标签:
15条回答
  • 2020-11-28 00:52

    Using Swift UIView extension:

    extension UIView {
        func removeAllSubviews() {
            for subview in subviews {
                subview.removeFromSuperview()
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 00:52

    In order to remove all subviews Syntax :

    - (void)makeObjectsPerformSelector:(SEL)aSelector;
    

    Usage :

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

    This method is present in NSArray.h file and uses NSArray(NSExtendedArray) interface

    0 讨论(0)
  • 2020-11-28 01:02

    This does only apply to OSX since in iOS a copy of the array is kept

    When removing all the subviews, it is a good idea to start deleting at the end of the array and keep deleting until you reach the beginning. This can be accomplished with this two lines of code:

    for (int i=mySuperView.subviews.count-1; i>=0; i--)
            [[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
    

    SWIFT 1.2

    for var i=mySuperView.subviews.count-1; i>=0; i-- {
        mySuperView.subviews[i].removeFromSuperview();
    }
    

    or (less efficient, but more readable)

    for subview in mySuperView.subviews.reverse() {
        subview.removeFromSuperview()
    }
    

    NOTE

    You should NOT remove the subviews in normal order, since it may cause a crash if a UIView instance is deleted before the removeFromSuperview message has been sent to all objects of the array. (Obviously, deleting the last element would not cause a crash)

    Therefore, the code

    [[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
    

    should NOT be used.

    Quote from Apple documentation about makeObjectsPerformSelector:

    Sends to each object in the array the message identified by a given selector, starting with the first object and continuing through the array to the last object.

    (which would be the wrong direction for this purpose)

    0 讨论(0)
  • 2020-11-28 01:02
    view.subviews.forEach { $0.removeFromSuperview() }
    
    0 讨论(0)
  • 2020-11-28 01:05

    If you're using Swift, it's as simple as:

    subviews.map { $0.removeFromSuperview }
    

    It's similar in philosophy to the makeObjectsPerformSelector approach, however with a little more type safety.

    0 讨论(0)
  • 2020-11-28 01:07

    If you want to remove all the subviews on your UIView (here yourView), then write this code at your button click:

    [[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
    
    0 讨论(0)
提交回复
热议问题