Щелкните в поле зрения NSCollectionViewItem

Я новичок в Cocoa dev, поэтому многие концепции мне непонятны... Я пытаюсь создать простое приложение, которое будет использовать Flickr API для извлечения пользовательских фотосетов и отображения их в NSCollectionView, щелкнув их, начнет загружать фотографии набора фотографий.

Я использую Xcode 5.0.1 с последним SDK 10.9.

Прочитав несколько статей о том, как использовать привязку для работы с NSCollectionView, я столкнулся с другой проблемой, связанной с обработкой событий в NSCollectionViewItem.

Насколько я понимаю, события мыши могут быть легко обработаны с помощью реализации

-(void) mouseDown:(NSEvent *)theEvent

В подклассе NSView скажем

@interface MyViewController : NSView {
}

И назначьте пользовательский класс представления подклассу, который я создал (MyViewController) в InterfaceBuilder.

Теперь у меня нет проблем с тем, как указано выше, и в большинстве виджетов управление мышью обрабатывалось, как и ожидалось. Проблема в том, что у меня есть подкласс NSCollectionViewItem, как показано ниже:

@interface MyItemController : NSCollectionViewItem {
}

Я пытаюсь реализовать там метод mousedown, этот класс был установлен как владелец файла в отдельном файле nib. И представление будет автоматически загружаться при загрузке NSCollectionView.

Теперь MyItemController не может быть классом клиента в объекте представления в IB, что, очевидно, связано с тем, что он является не подклассом NSView, а подклассом NSCollectionViewItem.

Если я напишу подкласс NSView и создам собственный класс объекта представления, я смогу получить mousedown. Однако при таком подходе я не могу получить представленный объект и индекс NSMutableArray, и они являются важной информацией, которая мне нужна.

Итак, мой вопрос: как правильно работать с представлением событий мыши в NSCollectionViewItem? Мой код в GitHub здесь:

https://github.com/jasonlu/flickerBackupTool

Спасибо!

ОБНОВИТЬ

Я нашел подход к решению этой проблемы путем создания подкласса NSView и реализации mousedown и использования super, subviews для получения и индексирования и самого массива.

- (void)mouseDown:(NSEvent *)theEvent  {
    NSCollectionView *myCollectionView = (NSCollectionView *)[self superview];
    NSInteger index = [[myCollectionView subviews]  indexOfObject:self];
    NSLog(@"collection view super view: %@",myCollectionView);
    NSLog(@"collection index: %ld",index);
    NSLog(@"array: %@", [[myCollectionView content] objectAtIndex:index]);
}

Кажется, это работает, но я не подаю в суд, если это лучшая практика, похоже, что это слишком сильно зависит от представления, и для достижения массива потребовался долгий путь.


person Jason Lu    schedule 12.11.2013    source источник


Ответы (1)


Я бы не поспорил, что NSCollectionView всегда создает все подпредставления (подпредставления, которые находятся далеко от области просмотра, могут быть задержаны и/или использованы повторно). Поэтому я бы не стал полагаться на поиск в подвидах.

Перегрузите NSViewController, чтобы создать NSView, чтобы представляемый объект, назначенный NSViewController, был доступен из NSView. Оттуда вы можете искать фактический контент для определения индекса.

Перегрузка NSCollectionView и запись фактического индекса во время создания представления, вероятно, не сработает, поскольку удаленный элемент, вероятно, не создает повторно никаких представлений.

person carmin    schedule 12.01.2014