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í.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top