self.view에서 모든 하위보기를 제거하는 가장 좋은 방법은 무엇입니까?


87

다음과 같은 것이 효과가있을 것이라고 생각했습니다.

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

모든 종류의 하위보기를 제거하고 싶습니다. UIImages, Buttons, Textfields 등


1
작동합니다. 여러 계층의 하위보기가있는 경우 일종의 재귀 적으로 수행해야 할 수도 있습니다. 뭘 원하는지 잘 모르겠습니다.
Dustin

작동합니까? 나는 그것이 배열 b에서 즉시 제거 subviews되어 금지 된 빠른 열거 루프 내에서 돌연변이를 일으킬 것이라고 생각했습니다 .
Mazyod

2
@Mazyod check subviews 속성 : @property (nonatomic, readonly, copy) NSArray * subviews-복사로 선언되므로 하위보기를 삭제할 때 해당 배열을 수정하지 않습니다 (복사본이기 때문에).
Max

1
@Max : 틀 렸습니다. copy이 복사본을 만드는 지정 수단 설정할 때 ; 얻는 것에 대해 지정된 것이 없습니다. 복사본이 반환 될 가능성이 높지만 속성 정의의 일부는 아닙니다.
jscs

@ W'rkncacnter는 동의합니다. 복사 키워드는 가치 얻기와 관련이 없다는 것이 맞습니다 (하지만 내 생각에는 묵시적이라고 생각합니다).
Max

답변:


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

변형과 동일하지만 약간 더 짧습니다.


이것을 제외하고는 어떨까요 – 같은 방법을 사용합니까? @Mazyod
Hemang 2015-09-01

makeObjectsPerformSelector와 subview 제거를위한 수동 루프 사이에 성능 별 차이가 있습니까?
Ganpat

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

Swift의 동일한 버전.


7

빠른:

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

2

이렇게 사용할 수 있습니다

//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

0

Swift 4+의 경우 UIView. 필요할 때마다 전화하십시오.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.