NSArray удалить последний объект типа? - PullRequest
3 голосов
/ 03 февраля 2012

Работа с массивом UIViews и UIImageViews ([[[UIApplication sharedApplication] окно] подпредставления]). Мне нужно удалить только объект с самым высоким индексом типа UIImageView.

Ответы [ 3 ]

6 голосов
/ 03 февраля 2012

Вы можете использовать метод 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];
}
5 голосов
/ 03 февраля 2012

другое блочное решение

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

неблокированное решение:

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

Я опубликовал некоторый демонстрационный код , который показывает оба решения.

3 голосов
/ 03 февраля 2012

Как насчет:

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];
...