2010-08-03 20 views
7

He estado intentando esto durante dos días y constantemente estoy en callejones sin salida.Poblando NSTableview desde una matriz mutable

He pasado por Cocoa Programming de Aaron Hillegass para MAC OS X, y he realizado todos los ejercicios pertinentes relacionados con NSTableview y matrices mutables, y he intentado modificarlos para adaptarme a mis necesidades.

Sin embargo, ninguno de ellos parece estar utilizando una matriz con objetos como fuente de datos, parece utilizar la tabla como el origen de datos.

Estoy tratando de implementar "reelaboración de Jonas Jongejan" de mi código here, con un frente de cacao para mostrar los resultados.

Cualquier consejo o sugerencia Sé que esto debería ser simple, pero estoy perdido en el desierto aquí.

puedo rellenar la tabla mediante el establecimiento de la matriz

Respuesta

14

Es bastante simple en realidad, una vez que llegue a entenderlo (por supuesto!). No puede usar un NSArray directamente como fuente de tabla. Necesita crear un objeto personalizado que implemente NSTableViewDataSource o implementar ese protocolo en alguna clase existente, generalmente un controlador. Si usa Xcode para crear una aplicación estándar basada en documentos, la clase de controlador de documentos (se llamará MyDocument) es una buena clase para usar.

que necesita para implementar al menos estos dos métodos:

– numberOfRowsInTableView: 
– tableView:objectValueForTableColumn:row: 

Si tiene una matriz mutable cuyos valores desea utilizar en una vista de tabla con una columna, algo así como lo que sigue debe hacer lo un comienzo:

– numberOfRowsInTableView: (NSTableView*) aTableView 
{ 
    return [myMutableArray count]; 
} 

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    return [myMutableArray objectAtIndex: rowIndex]; 
} 

Sólo se me ha ocurrido que podría añadir los dos métodos anteriores como una categoría a la sustitución de NSArray myMutableArray con self y entonces usted puede utilizar una matriz como fuente de datos.


De todos modos, con una matriz mutable, es importante que cada vez que se cambie, es necesario dejar que la vista de tabla saber que se ha cambiado, por lo que necesita para enviar la vista de tabla -reloadData.


Si su vista de tabla tiene más de una columna y desea rellenarlo con propiedades de objetos en su conjunto, hay un truco que puede hacer para que sea más fácil para usted.Digamos que los objetos de la matriz son instancias de una clase llamada Persona con dos métodos definidos:

-(NSString*) givenName; 
-(NSString*) familyName; 

y quiere que su vista de tabla para tener una columna para cada uno de ellos, se puede establecer la propiedad identifier de cada columna al nombre de la propiedad en la persona que la que muestra la columna y usar algo como lo siguiente:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    Person* item = [myMutableArray objectAtIndex: rowIndex]; 
    return [item valueForKey: [tableColumn identifier]]; 
} 

si se reemplaza con valueForKey:valueForKeyPath: y la clase de persona que también tiene los siguientes métodos:

-(Person*) mother; 
-(Person*) father; 
-(NSString*) fullName; // concatenation of given name and family name 

puede agregar columnas de tabla con identificadores como: father.fullName o mother.familyName y los valores se completarán automáticamente.

1

En el iPhone (sé que estás hablando de Mac, pero quizás esto podría ser útil), tienes que usar la delegación para cargar un TableView. Solicita una celda y usa su matriz para completar los datos donde sea necesario. No estoy seguro de si esto funciona para la Mac, pero valdría la pena investigarlo.

conjunto Quizás dataSource a sí mismo y utilizar los mismos métodos de delegado para acceder a su gama basado en la fila y la columna #

+0

@ la respuesta de willcodejavaforfood es para el iPhone, pero puedes seguir ese enlace para ver lo que quiero decir – RSully

+0

Vaya, tengo iPhones en mi cerebro :) – willcodejavaforfood

3

Puede ir a la ruta de origen de datos y hacer todo el trabajo pesado usted mismo, o puede dejar que las fijaciones hagan todo el trabajo pesado por usted. Agregue NSArrayController al archivo de punta que tiene la vista de tabla en él. Asegúrese de que el propietario de la punta del archivo esté configurado en la misma clase que tiene la matriz mutable. Enlace el contentArray del controlador de array al File's Owner.myMutableArray. Para cada columna, enlace Value al controlador de matriz arrangedObjects y agregue la ruta de clave apropiada. Esto le permitirá obtener cosas como la clasificación de usuarios de forma gratuita si alguna vez lo necesita.

Cuestiones relacionadas