У меня есть рабочий NSCollectionView
с одним незначительным, но критическим исключением. Получение и выделение выбранного элемента в коллекции.
У меня все это работало до Snow Leopard, но, похоже, что-то изменилось, и я не могу понять, как это сделать, поэтому я взял NSCollectionView
обратно к базовому тесту и следовал документации Apple. для создания NSCollectionView здесь:
http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/CollectionViews/Introduction/Introduction.html
Представление коллекции работает хорошо, следуя краткому руководству. Тем не менее, это руководство не обсуждает выбор, кроме "There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
Используя это в качестве примера, я перешел к следующему этапу привязки контроллера массива к NSCollectionView
с помощью ключа контроллера selectionIndexes
, думая, что это свяжет любой выбор, который я сделаю между NSCollectionView
и контроллером массива. и, таким образом, запуск уведомления KVO. Я также установил NSCollectionView
для выбора в IB.
Похоже, что для NSCollectionView
делегата выбора нет, и, в отличие от большинства представлений пользовательского интерфейса Какао, по умолчанию нет выделенного выделения.
Так что моя проблема действительно сводится к связанной проблеме, но два разных вопроса.
- Как мне получить выбранный предмет?
- Как показать выделение элемента?
Похоже, что руководства по программированию
NSCollectionView
немногочисленны и далеко друг от друга, и большинство поисковых запросов через Google, по-видимому, поднимают реализации до Snow Leopard или используют представление в отдельном файле XIB.
Для последнего (отдельный файл XIB для представления) я не понимаю, почему это должно быть предварительным условием, иначе я бы заподозрил, что Apple не включила бы представление в тот же пакет, что и элемент представления коллекции. .
Я знаю, что это будет проблема "не вижу дерева для деревьев" - так что я готов к "дох!" момент.
Как обычно, всякая помощь очень ценится.
Обновление 1
ОК, так что я решил найти выбранный пункт (ы), но пока не смог определить выделение. Для тех, кто заинтересован в выяснении выбранных предметов (при условии, что вы следуете руководству Apple):
В контроллере (в моем тестовом случае App Delegate) я добавил следующее:
В пробуждении от Nib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Новый метод
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController selectedObjects] count] > 0)
{
if ([[personArrayController selectedObjects] count] == 1)
{
personModel * pm = (PersonModel *)
[[personArrayController selectedObjects] objectAtIndex:0];
NSLog(@"Only 1 selected: %@", [pm name]);
}
else
{
// More than one selected - iterate if need be
}
}
}
Не забудьте сдать deloc для не-GC
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
Все еще ищем разрешение подсветки ...
Обновление 2
Принял совет Макатоми, но все еще имел проблему. Размещение соответствующих методов класса, чтобы увидеть, где я ошибся.
MyView.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
MyView.m
#import "MyView.h"
@implementation MyView
@synthesize selected;
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect
{
NSRect outerFrame = NSMakeRect(0, 0, 143, 104);
NSRect selectedFrame = NSInsetRect(outerFrame, 2, 2);
if (selected)
[[NSColor yellowColor] set];
else
[[NSColor redColor] set];
[NSBezierPath strokeRect:selectedFrame];
}
@end
MyCollectionViewItem.h
#import <Cocoa/Cocoa.h>
@class MyView;
@interface MyCollectionViewItem : NSCollectionViewItem {
}
@end
"MyCollectionViewItem.m *
#import "MyCollectionViewItem.h"
#import "MyView.h"
@implementation MyCollectionViewItem
-(void)setSelected:(BOOL)flag
{
[(MyView *)[self view] setSelected:flag];
[(MyView *)[self view] setNeedsDisplay:YES];
}
@end