[macos] Swift에서 뷰의 모든 하위 뷰를 제거하는 방법은 무엇입니까?

하위 뷰를 하나씩 제거하는 대신 슈퍼 뷰에서 모든 하위 뷰를 한 번에 제거하는 간단한 방법을 찾고 있습니다.

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

내가 무엇을 놓치고 있습니까?

최신 정보

내 앱에는 메인이 container_view있습니다. container_view일종의 탐색을 제공하기 위해 다른보기를 하위보기로 추가해야합니다 .

따라서 특정 페이지를 “열기”위해 단추를 클릭하면 모든 하위보기를 제거하고 새 페이지를 추가해야합니다.

업데이트 2-작동하는 솔루션 (OS X)

애플이 고쳤다 고 생각합니다.

이제는 그 어느 때보 다 쉬워졌습니다.

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



답변

편집 : (예레미야 / 롤로 감사)

iOS 용 Swift에서이를 수행하는 가장 좋은 방법은 다음과 같습니다.

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 = []

( 다른 방법은 모든 하위 보기 제거? 를 참조 하십시오 )


이것은 참고 맥 OS 질문이 대답에 대해서만 작동 맥 OS . iOS에서는 작동하지 않습니다.


답변

이 문제를 해결할 수 있었는지 모르겠지만 최근에 For 루프가 매번 하나의 뷰를 남겨 두는 비슷한 문제가 발생했습니다. removeFromSuperview ()가 호출되었을 때 self.subviews가 변경 되었기 때문일 수 있습니다.

이 문제를 해결하려면 다음을 수행하십시오.

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()
}


답변

이 시도:

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


답변

모든 서브 뷰를 제거하기위한 확장 기능으로 빠르게 제거됩니다.

import Foundation
import UIKit

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

}