Как определить, какие элементы NSCollectionView действительно видны

Предоставление ответа, который кажется отличным от всех остальных.

Я рекомендую вам проверить NULL в if s.

Причина:

Мы не должны оставлять шанс, чтобы наша программа была разбита. NullPointer генерируется системой. Поведение генерируемых системой исключений невозможно предсказать. Вы не должны оставлять свою программу в руках Системы, когда у вас уже есть способ ее обработки самостоятельно. И добавьте механизм обработки исключений для дополнительной безопасности. !!

Для упрощения чтения кода проверьте это для проверки условий:

if (wsObject.getFoo() == null || wsObject.getFoo().getBar() == null || wsObject.getFoo().getBar().getBaz() == null) 
   return -1;
else 
   return wsObject.getFoo().getBar().getBaz().getInt();

EDIT:

Здесь вам нужно сохранить эти значения wsObject.getFoo(), wsObject.getFoo().getBar(), wsObject.getFoo().getBar().getBaz() в некоторых переменных. Я не делаю этого, потому что я не знаю возвращаемых типов этих функций.

Любые предложения будут оценены .. !!

0
задан Thomas Tempelmann 30 March 2019 в 22:35
поделиться

1 ответ

Документация для -[NSCollectionView visibleItems]:

Этот массив может содержать элементы, которые находятся за пределами фактического видимого прямоугольника представления коллекции. Например, он может содержать элементы, которые были недавно видны, но с тех пор были прокручены вне поля зрения. Чтобы проверить, является ли элемент действительно видимым, проверьте, пересекает ли его прямоугольник рамки visibleRect представления коллекции.

Итак, вот функция, которая выполняет этот тест, возвращая только фактически видимые элементы:

- (NSArray<NSCollectionViewItem*> * _Nonnull) trulyVisibleItemsInCollectionView:(NSCollectionView*)collectionView
{
    NSMutableArray<NSCollectionViewItem*> *result = [NSMutableArray array];
    NSArray<NSCollectionViewItem *> *items = collectionView.visibleItems;
    NSRect viewRect = collectionView.visibleRect;
    for (NSCollectionViewItem *item in items) {
        if (NSIntersectsRect(item.view.frame, viewRect)) {
            [result addObject:item];
        }
    }
    return result;
}

Это все еще затрудняет эффективное управление очередью рендеринга, хотя:

  1. Когда вызывается my collectionView:itemForRepresentedObjectAtIndexPath:, представления еще не добавляются в collectionView, поэтому еще слишком рано определять, следует ли запланировать эту плитку для немедленного рендеринга.

  2. Таймер может использоваться для периодической проверки того, какие элементы видны, и перемещения их в начало очереди. Его не следует использовать для принятия решения о том, добавлять ли элементы в очередь, потому что, если таймер срабатывает слишком рано после создания объекта плитки, он еще не будет добавлен в представление, что приведет к большей задержке до рендеринг начинается. Поэтому я считаю, что лучше всего добавлять элементы в средство визуализации, как только он узнает, что они могут быть необходимы, но измените порядок очереди, как только станет ясно, какие элементы будут видны, а какие нет.

0
ответ дан Thomas Tempelmann 30 March 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: