Я пишу небольшое приложение, предварительно называемое «CocoaMix», целью которого является проверка кода, который я написал для доступа иерархию доступности для различных пользовательских интерфейсов. По существу, что я пытаюсь выполнить, это NSOutlineView
слева и «пример» справа от тестового пользовательского интерфейса.NSOutlineView - возвращается значение объекта, но отображается только заголовок заполнителя «Table View Cell»
До сих пор для реализации источника данных у меня есть:
@interface CMTopLevelCategory : NSObject
@property (readonly) NSString *name;
@property (readonly) NSArray *examples;
- (id)initWithName:(NSString *)name examples:(NSArray *)examples;
@end
@interface CMExample : NSObject
@property (readonly) NSString *name;
- (id)initWithName:(NSString *)name;
@end
@interface CMSideOutlineViewDataSource : NSObject <NSOutlineViewDataSource>
@end
//...
#define CMNameColumnIdentifier @"name"
#define CMCountColumnIdentifier @"count"
@interface CMSideOutlineViewDataSource()
@property NSArray *topLevelCategories;
@end
@implementation CMSideOutlineViewDataSource
- (id)init {
self = [super init];
if (self) {
CMExample *largeTableExample = [[CMExample alloc] initWithName:@"Large Table"];
CMTopLevelCategory *tablesCategory = [[CMTopLevelCategory alloc] initWithName:@"Tables" examples:@[ largeTableExample ]];
_topLevelCategories = @[ tablesCategory ];
}
return self;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
if (item) {
if ([item isKindOfClass:CMTopLevelCategory.class]) {
CMTopLevelCategory *topLevelCategory = item;
return [topLevelCategory.examples objectAtIndex:index];
}
} else {
return [self.topLevelCategories objectAtIndex:index];
}
return nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return [item isKindOfClass:CMTopLevelCategory.class];
}
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
if (item) {
if ([item isKindOfClass:CMTopLevelCategory.class]) {
CMTopLevelCategory *topLevelCategory = item;
return [topLevelCategory.examples count];
}
} else {
return [self.topLevelCategories count];
}
return 0;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
if ([item isKindOfClass:CMTopLevelCategory.class]) {
CMTopLevelCategory *topLevelCategory = item;
if ([tableColumn.identifier isEqualToString:CMNameColumnIdentifier]) {
return topLevelCategory.name;
} else if ([tableColumn.identifier isEqualToString:CMCountColumnIdentifier]) {
return [NSNumber numberWithUnsignedInteger:[topLevelCategory.examples count]];
}
} else if ([item isKindOfClass:CMExample.class]) {
CMExample *example = item;
if ([tableColumn.identifier isEqualToString:CMNameColumnIdentifier]) {
return example.name;
}
}
return @"default value";
}
@end
Чтобы объяснить это, элементы верхнего уровня должны быть категориями примеров как «Таблица», а затем для каждой категории идут для некоторых примеров пользовательских интерфейсов (например, «Большая таблица» в примерах «Таблицы»).
Когда я построить и запустить, точки останова, которые я поставил в outlineView:objectValueForTableColumn:byItem:
срабатывают, но текст в NSOutlineView
по-прежнему заполнитель «ячейки таблицы View» Текст:
Что я делаю неправильно?
Является ли это обзорным видом на основе представления? Какова субъектность представления для каждой ячейки таблицы? Например, является ли ячейка представлением экземпляра 'NSTableCellView', содержащего' NSTextField'? Или это просто голый «NSTextField»? Вы настроили привязки в под иерархии ячеек таблицы? Если да, объясните привязки, которые вы настроили. –