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
그래서 당신은 더 선택적일 수 있고, 혹은 이것을 다른 컬렉션에 부를 수 있습니다.UIView
s.
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
'it-source' 카테고리의 다른 글
Xcode/Mac OS에서 관리자가 아닌 개발자 권한 부여 (0) | 2023.05.06 |
---|---|
GROUP BY와 DISTINCT 사이에 차이가 있습니까? (0) | 2023.05.06 |
조쉬 스미스의 릴레이 명령 이행에 결함이 있습니까? (0) | 2023.05.06 |
오류: 도커의 Alpine에 psycopg2를 설치할 때 pg_config 실행 파일을 찾을 수 없습니다. (0) | 2023.05.06 |
두 로컬 분기 Git 병합 (0) | 2023.05.01 |