it-source

Swift에서 보기의 모든 하위 보기를 제거하는 방법은 무엇입니까?

criticalcode 2023. 5. 6. 15:08
반응형

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

특정 클래스(예: UI 레이블)의 모든 하위 뷰를 제거하려면 다음을 사용합니다.

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에서는 작동하지 않습니다.

스위프트 5

하위 뷰를 제거하기 위해 두 가지 다른 방법을 만듭니다.그리고 우리가 그것들을 넣으면 사용하기가 훨씬 쉽습니다.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() }
    }
}

사용해 보십시오.

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

당신이 이 문제를 해결할 수 있었는지는 모르겠지만 저는 최근 For 루프가 매번 하나의 뷰를 남기는 비슷한 문제를 경험했습니다.이것은 removeFromSuperview()가 호출되었을 때 self.subview가 변형되었기 때문이라는 것을 알게 되었습니다.

이 문제를 해결하기 위해 다음을 수행했습니다.

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

.copy()를 수행함으로써 self.subviews 배열을 변경하는 동안 각 subview를 제거할 수 있었습니다.이는 복사된 배열(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()
      }

업데이트: 모험심이 강한 경우 아래와 같이 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()
    }

스위프트 3

보기에 태그를 추가하면 특정 보기를 제거할 수 있습니다.

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.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일 exp, 네, API의 경우 언더스코어를 포기했습니다).

구문이 약간 틀렸습니다.명확하게 캐스팅해야 합니다.

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }

당신은 이것을 시도해야 합니다.

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

특정 클래스의 하위 뷰만 제거하기 위해 - 이것은 Xcode 6.1.1에서 작동하는 유일한 Swift 코드였습니다.제거하려는 하위 보기만 UIButton 유형이라고 가정하면...

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}

스위프트 3용

superview에서 제거하는 것만으로는 배열에서 버튼이 지워지지 않기 때문에 다음과 같이 했습니다.

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

이것을 사용해 보세요. 저는 이것을 테스트했습니다.

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }

위해서Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

이것이 당신에게 충분히 쓸모가 있기를 바랍니다.

여기 당신이 찾고 있던 한 줄기 상품이 있습니다.

view.subviews.filter({$0.tag == 321}).forEach({$0.removeFromSuperview()})

보기에 태그를 지정하는 것을 잊지 마십시오.someView.tag = 321이 코드로 제거하기 전에.

한 줄:

while view.subviews.count > 0  { (view.subviews[0] as? NSView)?.removeFromSuperview() } 

다음과 같은 다른 접근 방식을 사용하여 모든 데이터 수집에 대한 작업을 호출할 수 있습니다.UIView인스턴스(또는)UIView하위 클래스).이를 통해 다음과 같은 것을 쉽게 삽입할 수 있습니다.filter끝나고.subviews그래서 당신은 더 선택적일 수 있고, 혹은 이것을 다른 컬렉션에 부를 수 있습니다.UIViews.

extension Array where Element: UIView {
  func removeEachFromSuperview() {
    forEach {
      $0.removeFromSuperview()
    }
  }
}

사용 예:

myView.subviews.removeEachFromSuperview()

// or, for example:

myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()

또는 동일한 작업을 수행할 수 있습니다.UIView확장(비록 이것은 일부 임의 배열에서 호출될 수 없지만)UIView인스턴스):

extension UIView {
    func removeSubviews(predicate: ((UIView) -> Bool)? = nil) 
        subviews.filter(
            predicate ?? { _ in true }
        ).forEach {
            $0.removeFromSuperview()
        }
    }
}

사용 예:

myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }

당신은 비슷한 것을 시도했습니까?

for o : AnyObject in self.subviews {
     if let v = o as? NSView {
         v.removeFromSuperview()
     }
}

언급URL : https://stackoverflow.com/questions/24312760/how-to-remove-all-subviews-of-a-view-in-swift

반응형