NSTableView с несколькими столбцами
-
18-09-2019 - |
Вопрос
Каков простой способ настроить мой NSTableView с несколькими столбцами для отображения только определенных данных в одном столбце.У меня настроены IBOutlets, но я не знаю, что делать дальше.
Решение
Предполагая, что вы не используете привязки Cocoa / Core Data, вы можете отобразить данные в NSTableView, реализовав два метода из NSTableViewDataSource Источник данных протокол.Обычно ваш контроллер реализует протокол, поэтому откройте файл controller .m и добавьте эти методы в файл контроллера @implementation
:
- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
return 25; // fill this out
}
– (id) tableView:(NSTableView*)tableView
objectValueForTableColumn:(NSTableColumn*)column
row:(int)row {
return row % 3 ? @"Tick..." : @"BOOM!"; // fill this out
}
Вам нужно накрыть на стол dataSource
свойство для контроллера.В элементе управления Interface Builder -перетащите из табличного представления в контроллер и установите dataSource
.Теперь создайте и запустите, и вы должны увидеть свои данные в таблице.
Если вы хотите заполнить только один столбец, добавьте IBOutlet NSTableColumn * в свой контроллер;давайте назовем это explosiveColumn
.В Interface Builder перетащите элемент управления с контроллера в столбец, который вы хотите заполнить, и установите explosiveColumn
.Затем в TableView:objectValueForTableColumn:строка:вы можете проверить, является ли column
параметр - это тот же объект, что и тот, на который установлена розетка:
– (id) tableView:(NSTableView*)tableView
objectValueForTableColumn:(NSTableColumn*)column
row:(int)row {
if (column == explosiveColumn) {
return row % 3 ? @"Tick..." : @"BOOM!";
} else {
// other columns blank for now
return nil;
}
}
Этот учебник может быть полезен: http://www.cocoadev.com/index.pl?NSTableViewTutorial
Другие советы
Вот пример использования нескольких табличных представлений с методами источника данных и приложением на основе документов:
#pragma mark - Data Source Methods
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv
{
if (tv == racerTableView)
return [racerList count];
else if (tv == vehicleTableView)
return [vehicleList count];
else
return 0; // something wrong here...
}
- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col
row:(NSInteger)rowi
{
NSString *colid = [col identifier];
if (tv == racerTableView){
NHRacers *racer = [racerList objectAtIndex:rowi];
return [racer valueForKey:colid];
}
else if (tv == vehicleTableView){
NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
return [vehicle valueForKey:colid];
}
else
return 0; // something wrong here...
}
- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi
{
NSString *colid = [col identifier];
if (tv == racerTableView) {
NHRacers *racer = [racerList objectAtIndex:rowi];
[racer setValue:obj forKey:colid];
}
else if (tv == vehicleTableView){
NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
[vehicle setValue:obj forKey:colid];
}
else
nil; // something wrong here...
[self updateChangeCount:NSChangeDone];
}
Выходы источника данных tableview установлены для Владельца файла, а Владелец файла установил vehicleTableView и racerTableView для их соответствующего "Табличного представления" в IB.Ключ colid проверяет идентификатор (устанавливается в IB путем выбора столбца табличного представления в раскрывающемся списке "Identity", при этом отображается "Identity Inspector").Эти значения были выбраны в качестве свойств KVC (совместимых с кодированием ключей) классов, отображаемых в табличных представлениях:используйте первую букву нижнего регистра (остальное см. в документах Apple docs).
Например:(в NHVehicles.h)
@interface NHVehicles : NSObject
{
NSUInteger entry;
NSString *name;
NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end
(в NHVehicles.m)
@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end
для этого TableView "entry", "name" и "vehicleClass" будут введены (без "o ") в поля идентификатора для их соответствующих столбцов.
Если вы не хотите показывать какие-то данные в классе, просто не вводите ключ для идентификатора столбца.Небольшое предостережение:Я использую Xcode 4.5.1, и я заметил, что как только я ввел несколько ключей для идентификаторов определенного столбца, а затем передумал и попытался очистить текст, он пожаловался, когда я удалил текст из поля идентификатора (я больше не мог оставлять поле пустым для столбцов, которые я отредактировал).Обойти это было несложно, но это стало сюрпризом.