Я новичок в 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]);
}
Кажется, это работает, но я не подаю в суд, если это лучшая практика, похоже, что это слишком сильно зависит от представления, и для достижения массива потребовался долгий путь.