NSTableView com várias colunas
-
18-09-2019 - |
Pergunta
Qual é uma maneira fácil de configurar meu NStableView com várias colunas para exibir apenas determinados dados em uma coluna. Eu tenho os iboutlets configurados, mas não sei para onde ir a partir daí.
Solução
Supondo NSTableViewDataSource protocolo. Normalmente, seu controlador implementará o protocolo, então abra o arquivo .m do controlador e adicione esses métodos ao controlador @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
}
Você precisa definir a mesa dataSource
propriedade para o controlador. Em interface Builder Control-Drag da visualização da tabela para o controlador e definir dataSource
. Agora construa e corra e você verá seus dados na tabela.
Se você deseja preencher apenas uma coluna, adicione um iboutlet nstableColumn* ao seu controlador; Vamos chamá -lo explosiveColumn
. No construtor de interface, control-drag do controlador para a coluna que você deseja preencher e definir explosiveColumn
. Então, na Tabelaview: ObjectValueFortableColumn: Row: você pode testar se o column
O parâmetro é o mesmo objeto que a saída está definida como:
– (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;
}
}
Este tutorial pode ser útil: http://www.cocoadev.com/index.pl?nstableViewTutorial
Outras dicas
Aqui está um exemplo usando várias visualizações de tabela com métodos de fonte de dados e um aplicativo baseado em documentos:
#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];
}
Os pontos de venda do TableView DataSource estão definidos para o proprietário do arquivo e o proprietário do arquivo definiu o VehicleTableView e o RacertableView para sua respectiva "Visualização da tabela" no IB. A tecla Colid verifica o identificador (definido no IB, selecionando a coluna Visualização da tabela sob a suspensão da "identidade", enquanto o "Inspetor de Identidade" é mostrado). Esses valores foram escolhidos para serem as propriedades KVC (compatível com codificação -chave) das classes que estão sendo exibidas nas visualizações da tabela: Use a primeira letra da minúscula (consulte o Apple Docs para descansar).
Por exemplo: (em hvehicles.h)
@interface NHVehicles : NSObject
{
NSUInteger entry;
NSString *name;
NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end
(em hvehicles.m)
@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end
Para esta visualização de tabela, "entrada", "nome" e "vehicleclass" seriam digitados (sem) nos campos de identificador para suas respectivas colunas.
Se você não deseja mostrar alguns dados na classe, simplesmente não insira a chave para o identificador da coluna. Uma palavra de cautela: estou usando o Xcode 4.5.1 e notei que, uma vez que entrei em algumas chaves para um determinado identificador de coluna e depois mudei de idéia e tentei limpar o texto, ele reclamou quando eu excluí o texto do texto do Campo de identificador (eu não podia mais deixar o campo em branco para as colunas que havia editado). Isso não foi difícil de contornar, mas foi uma surpresa.