2012-02-03 5 views

답변

5

다른 블록 기반 솔루션

[window.subviews enumerateObjectsWithOptions:NSEnumerationReverse 
            usingBlock:^(id view, NSUInteger idx, BOOL *stop) 
    { 
     if ([view isKindOfClass:[UIImageView class]]){ 
      [view removeFromSuperview]; 
      *stop=YES; 
    } 
}]; 

비 블록 졸 의 ution :

for (UIView *view in [window.subview reverseObjectEnumerator]) 
{ 
    if ([view isKindOfClass:[UIImageView class]]){ 
      [view removeFromSuperview]; 
      break; 
    } 
} 

편집
나는 데모 코드를 발표, 즉 github에, 두 솔루션을 보여줍니다.

+0

블록이 더 예뻐요. – Kyle

+0

루프 내에서 직접 뷰를 제거하면 viewToRemove 변수를 더 이상 필요 없게 될 수 있습니다. –

+0

정말 확실합니까? 빠른 열거 형에서는 열거하는 동안 배열을 변경하는 것이 금지됩니다. – vikingosegundo

3

방법에 대해 :

UIWindow *window = [[UIApplication sharedApplication] window]; 
UIView *imageView = nil; 
for (UIView *view in window.subviews) 
{ 
    if ([view isKindOfClass:[UIImageView class]]) 
    { 
     imageView = view; 
    } 
} 

//this will be the last imageView we found 
[imageView removeFromSuperview]; 
+0

음 Kyle은 어쨌든 해결책을 더 좋아 했으므로, 당신이 이길 거라 생각합니다 .-) –

+1

:) 내 코드는 대개 매일 거울 앞에서 30 분을 보내고 꽤됩니다. – vikingosegundo

+0

위의 내 의견을 참조하십시오 - 더 향상시킬 수 있습니다. –

6
당신은 블록을 사용하여 테스트를 통과 개체에 대한 반대의 배열을 검색 한 다음 결과 위치에서 개체를 삭제하는 indexOfObjectWithOptions:passingTest: 방법을 사용할 수 있습니다

:

NSUInteger pos = [myArray indexOfObjectWithOptions:NSEnumerationReverse 
          passingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
    return [obj isKindOfClass:[UIImageView class]]; // <<== EDIT (Thanks, Nick Lockwood!) 
}]; 
if (pos != NSNotFound) { 
    [myArray removeObjectAtIndex:pos]; 
} 
+2

이것은 좋은 해결책이지만, == 대신 isKindOfClass를 사용하여 형식을 비교해야합니다. 그렇지 않으면 UIImageView가 실제로 UIImageView의 하위 클래스이면 작동하지 않습니다. –

+0

@NickLockwood 그건 좋은 캐치, 문제를 발견해 주셔서 대단히 감사합니다! – dasblinkenlight

+1

또한 pos! = NSNotFound 검사를 추가해야합니다. 배열에 UIImageView가 없으면 충돌이 발생합니다. –

관련 문제