2010-03-07 15 views
9

Tengo un problema con la clasificación de contenidos de NSTableColumn. En mi NSTableView hay tres columnas: Archivo, Tamaño, Ruta. Los contenidos se almacenan en NSMutableArray. Cada objeto en este conjunto es un NSDictionary que contiene tres claves: archivo, tamaño y ruta; el valor de cada uno es un NSString.Ordenando NSTableColumn contents

En el generador de interfaz, en los atributos de cada columna de tabla puedo elegir opciones de clasificación: Selector: IB ingresó "compare:" lo cual creo que está bien, porque comparo NSStrings. Clave de clasificación, y ese es el problema, creo, no sé qué ingresar aquí.

¿Alguna pista? Si tienes preguntas sobre mi código, por favor pregunta.

Respuesta

11

Así que encontré la solución completa.

Primero, vaya a Interface Builder. Seleccione la columna que desea ordenar. Vaya al inspector de la columna y elija el primer botón para ver los "Atributos de la columna de la tabla". Establecer los valores apropiados (literalmente, no "o" o @ son necesarios):

Sort key: file 

donde 'archivo' es la clave de diccionario que los contenidos se muestran en la columna

Selector: compare: 

función de clasificación estándar .

Ahora, guardar todos los cambios aquí y saltar a Xcode, a la clase en la que está el modelo, la fuente de los datos mostrados en la NSTableView ya debería saber que usted necesita dos métodos: allí.

-(NSInteger)numberOfRowsInTableView:(NSTableView *)tableView 
-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn 
*)tableColumn row:(NSInteger)row 

estos dos son necesarios para conformar el protocolo informal NSTableDataSource. Puede leer sobre esto en el MacDev Center.

Ahora todo lo que tiene que hacer es añadir un nuevo método:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 

Puede contener un código muy simple que va a hacer la cosa:

-(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange: (NSArray *)oldDescriptors 
{  
    NSArray *newDescriptors = [tableView sortDescriptors]; 
    [results sortUsingDescriptors:newDescriptors]; 
    //"results" is my NSMutableArray which is set to be the data source for the NSTableView object. 
    [tableView reloadData]; 
} 

Y eso es todo. Está funcionando en mi aplicación, espero que funcione en tu caso: D Todo debería funcionar automáticamente. Acabo de guardar todos los archivos y construí la aplicación. Y funcionó.:)

sitio que me ayudó: CocoaDev: SortingNSTableView

+0

¡Me salvaste el día! – 11684

+0

¡De nada! –

+0

Awsumly me salvó de enloquecer ... :) –

2

La clave es la key que utiliza en el diccionario para recuperar el valor.

En su caso tiene tres claves: archivo, tamaño y ruta. Seleccione el que desea ordenar. La clave se usa para recuperar el valor de cada registro que se utilizará para la clasificación.

Si sus claves son @ "file", @ "size", @ "path" y desea ordenar file intente poner value.file en el campo Sort Key en IB.

Use las teclas que usa cuando inserta values en su NSDictionary.

+0

Gracias por la respuesta pero no se el respuesta. Veo esta ventana: http://homepage.mac.com/simx/.Pictures/column_attributes.png Tengo la sensación de que es más fácil que agregar un código en mi aplicación. ¿Qué crees que debo ingresar en el campo 'Clasificar clave'? –

+0

** Editado **: eliminó el ejemplo del código 'confuso', fue para mostrarle cómo se hace en el código para que pueda ver la conexión entre los códigos IB y el código. Pero viendo que eso complica las cosas, lo eliminé. Por lo tanto, ahora debe quedar claro qué debe insertar en IB. – stefanB

+0

No funciona. Probé estos también: - valueForKey: @ "ruta" - objectForKey: @ "archivo" - value.objectForKey: @ "archivo" Ninguno está funcionando .. No sé qué hacer. Tal vez debería crear algunos enlaces o algo? ¿De quién es la perspectiva que debería escribir esta clave? –