모든 서브 뷰를 제거 하시겠습니까?
내 앱이 루트보기 컨트롤러로 돌아 오면 viewDidAppear:
메소드 에서 모든 하위보기를 제거해야합니다.
어떻게해야합니까?
편집은 : 덕분으로 cocoafan :이 상황은 그 사실에 의해 뒤죽박죽되어 NSView
및 UIView
핸들 것을 다르게. 들어 NSView
(전용 데스크톱 맥 개발), 당신은 단순히 다음을 사용할 수 있습니다 :
[someNSView setSubviews:[NSArray array]];
들어 UIView
(iOS 만 개발), 안전하게 사용할 수 makeObjectsPerformSelector:
때문에 subviews
속성이 반환됩니다 사본 파단의 배열을 :
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
배열이 열거되는 동안 배열 을 수정 하는 것처럼 보이는 것에 대해 Tommy 에게 감사드립니다 ( 하지만하지는 않습니다 ).makeObjectsPerformSelector:
subviews
NSView
UIView
자세한 내용은 이 SO 질문 을 참조하십시오.
참고 : 이 두 가지 방법 중 하나를 사용하면 기본보기에 포함 된 모든보기가 제거되고 다른 위치에 유지되지 않으면 해제됩니다 . removeFromSuperview 에 관한 Apple 문서에서 :
수신자의 수퍼 뷰가 nil이 아닌 경우,이 방법은 수신자를 해제합니다. 뷰를 재사용하려는 경우이 메소드를 호출하기 전에 뷰를 유지하고 뷰를 완료하거나 다른 뷰 계층 구조에 추가 한 후 적절하게 해제하십시오.
루트 컨트롤러에서 모든 하위 뷰를 가져와 각각 removeFromSuperview를 보냅니다.
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
Swift 에서는 다음 과 같은 기능적 접근 방식을 사용할 수 있습니다 .
view.subviews.forEach { $0.removeFromSuperview() }
이에 비해 명령 방식 은 다음과 같습니다.
for subview in view.subviews {
subview.removeFromSuperview()
}
이 코드 스 니펫은 iOS / tvOS 에서만 작동 하지만 macOS에서는 상황이 약간 다릅니다.
UIView (여기에서 yourView
)의 모든 하위보기를 제거하려면 버튼 클릭 시이 코드를 작성하십시오.
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
iOS에서는 배열의 사본이 유지되므로 OSX에만 적용됩니다.
모든 서브 뷰를 제거 할 때 배열의 끝에서 삭제를 시작하고 시작 부분에 도달 할 때까지 삭제를 유지하는 것이 좋습니다. 이 두 줄의 코드로 수행 할 수 있습니다.
for (int i=mySuperView.subviews.count-1; i>=0; i--)
[[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
스위프트 1.2
for var i=mySuperView.subviews.count-1; i>=0; i-- {
mySuperView.subviews[i].removeFromSuperview();
}
또는 (효율적이지 않지만 더 읽기 쉬운)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
노트
당신은해야 하지 전과 UIView의 인스턴스가 삭제 된 경우는 충돌을 일으킬 수 있기 때문에, 정상적인 순서로 파단을 제거 removeFromSuperview
메시지가 배열의 모든 객체로 전송되었습니다. (마지막으로 마지막 요소를 삭제하면 충돌이 발생하지 않습니다)
따라서 코드
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
해야 하지 사용합니다.
makeObjectsPerformSelector에 대한 Apple 문서 에서 인용하십시오 .
첫 번째 개체부터 시작하여 마지막 개체까지 배열을 통해 지정된 선택기로 식별 된 메시지를 배열의 각 개체로 보냅니다.
(이 목적을 위해 잘못된 방향이 될 것입니다)
이 방법으로 스위프트 2.0을 사용해보십시오
view.subviews.forEach { $0.removeFromSuperview() }
모든 하위 뷰를 제거하려면 다음 코드를 사용하십시오.
for (UIView *view in [self.view subviews])
{
[view removeFromSuperview];
}
Swift를 사용하는 경우 다음과 같이 간단합니다.
subviews.map { $0.removeFromSuperview }
철학적으로 makeObjectsPerformSelector
접근 방식 과 비슷 하지만 조금 더 유형 안전성이 있습니다.
스위프트 UIView
확장 사용하기 :
extension UIView {
func removeAllSubviews() {
for subview in subviews {
subview.removeFromSuperview()
}
}
}
objective-C에서 계속해서 UIView 클래스에서 카테고리 메소드를 작성하십시오.
- (void)removeAllSubviews
{
for (UIView *subview in self.subviews)
[subview removeFromSuperview];
}
모든 서브 뷰를 제거하려면 구문 :
- (void)makeObjectsPerformSelector:(SEL)aSelector;
사용법 :
[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
이 메소드는 NSArray.h 파일에 존재하며 NSArray (NSExtendedArray) 인터페이스를 사용합니다.
view.subviews.forEach { $0.removeFromSuperview() }
자동 레이아웃을 사용하는 ios6의 경우 제약 조건을 제거하기 위해 약간의 코드를 추가해야했습니다.
NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in tagview.constraints) {
if( [tagview.subviews containsObject:constraint.firstItem] ||
[tagview.subviews containsObject:constraint.secondItem] ) {
[constraints_to_remove addObject:constraint];
}
}
[tagview removeConstraints:constraints_to_remove];
[ [tagview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
나는 이것을 할 수있는 더 좋은 방법이 있다고 확신하지만 그것은 나를 위해 일했다. 필자의 경우 [tagview removeConstraints:tagview.constraints]
XCode에 제약 조건이 설정되어 있기 때문에 직접 을 사용할 수 없었 습니다.
monotouch / xamarin.ios에서 이것은 나를 위해 일했습니다 :
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);
슈퍼 뷰에서 모든 서브 뷰를 제거하려면 :
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}
참고 URL : https://stackoverflow.com/questions/2156015/remove-all-subviews
'Programing' 카테고리의 다른 글
Android의 내 응용 프로그램에서 보낸 메시지 만 가져 오려면 LogCat을 필터링 하시겠습니까? (0) | 2020.03.10 |
---|---|
ArrayList를 되 돌리는 가장 간단한 방법은 무엇입니까? (0) | 2020.03.10 |
PID 대신 이름으로 프로세스를 종료하려면 어떻게해야합니까? (0) | 2020.03.09 |
jQuery-즉시 숨겨진 양식 요소 만들기 (0) | 2020.03.09 |
jQuery를 사용하여 HTML 요소가 비어 있는지 어떻게 확인합니까? (0) | 2020.03.09 |