NSTableView с несколькими столбцами
Какой простой способ настроить мой NSTableView с несколькими столбцами, чтобы отображать только определенные данные в одном столбце. У меня настроены IBOutlets, но я не знаю, куда идти дальше.
2 ответа
Предполагая, что вы не используете привязки какао / основные данные, вы можете отобразить данные в NSTableView, реализовав два метода из протокола NSTableViewDataSource. Обычно ваш контроллер реализует протокол, поэтому откройте файл.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
Свойство для контроллера. В Интерфейсном Разработчике перетащите контроль от представления таблицы до контроллера и установите dataSource
, Теперь соберите и запустите, и вы должны увидеть свои данные в таблице.
Если вы хотите заполнить только один столбец, добавьте IBOutlet NSTableColumn* в свой контроллер; давай называть это explosiveColumn
, В Интерфейсном Разработчике перетащите контроль от контроллера до столбца, который вы хотите заполнить и установить explosiveColumn
, Затем в tableView:objectValueForTableColumn:row: вы можете проверить, 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];
}
Выходы источника данных table view устанавливаются как Владелец файла, а Владелец файла установил vehicleTableView и racerTableView для их соответствующего "Табличного представления" в IB. Ключ colid проверяет идентификатор (устанавливается в IB путем выбора столбца табличного представления в раскрывающемся списке "Идентичность", в то время как отображается "Инспектор идентификации"). Эти значения были выбраны в качестве свойств KVC (совместимых с кодировкой клавиш) классов, отображаемых в табличных представлениях: используйте первую букву в нижнем регистре (остальное см. В документации Apple).
Например: (в 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" будут вводиться (без) в поля идентификаторов для соответствующих столбцов.
Если вы не хотите показывать некоторые данные в классе, просто не вводите ключ для идентификатора столбца. Предостережение: я использую Xcode 4.5.1, и я заметил, что, как только я ввел несколько ключей для идентификаторов определенного столбца, а затем передумал и попытался очистить текст, он пожаловался, когда я удалил текст из поле идентификатора (я больше не мог оставлять поле пустым для отредактированных столбцов). Это было не сложно обойти, но это было сюрпризом.