2012-02-03 114 views
3

使用UIViews和UIImageViews([[[UIApplication sharedApplication]窗口]子視圖])的數組。我只需要刪除UIImageView類型的最高索引對象。NSArray刪除類型的最後一個對象?

+0

注意:您需要使用NSMutableArray而不是NSArray。 – Moshe 2012-02-03 15:37:00

回答

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 2012-02-03 16:16:06

+0

這些可以通過直接在循環中刪除視圖來改進,那麼您不再需要viewToRemove變量。 – 2012-02-03 16:22:57

+0

你確定嗎?在快速枚舉中枚舉時禁止更改數組。 – vikingosegundo 2012-02-03 16:24:21

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

不管怎樣,凱爾都喜歡你的解決方案,所以我猜你贏了,哈哈;-) – 2012-02-03 16:21:01

+1

:)我的代碼通常每天花在鏡子前30分鐘,變得漂亮。 – vikingosegundo 2012-02-03 16:22:45

+0

看到我上面的評論 - 你可以進一步改善它。 – 2012-02-03 16:24:31

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的子類,它將不起作用。 – 2012-02-03 16:26:23

+0

@NickLockwood這是一個很好的結果,非常感謝您發現問題! – dasblinkenlight 2012-02-03 16:31:45

+1

您還需要添加一個pos!= NSNotFound的檢查,否則會崩潰,如果該數組不包含UIImageView。 – 2012-02-03 17:50:45

相關問題