2010-01-14 29 views
0

Salutations,tableView sortDescriptorsDidChange: pas appelé

J'ai un NSTableView avec deux colonnes qui fonctionne bien ... sauf: Si je mets le descripteur de tri pour la table dans Interface Builder, les choses fonctionnent comme prévu et sortDescriptorsDidChange obtient appelé comme prévu. Si, cependant, je ne pas définir les descripteurs de tri dans Interface Builder et utiliser à la place ceci:

[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]]; 

(« nom » est l'identifiant de la colonne de gauche) dans mon code, sortDescriptorsDidChange ne fait jamais invoquaient . Comme je l'ai lu (mal lu?) La documentation d'Apple pour NSTableView, ce que je fais, je pense, devrait fonctionner. Qu'est-ce que je fais mal?

P.S. Je sais que je pourrais également utiliser un NSArrayController pour tout cela (et si je le fais fonctionne bien), mais pour une raison quelconque, j'ai choisi de ne pas le faire.

+0

à quel moment vous appelez 'setSortDescriptors'? Dans mon expérience je l'ai appelé trop tôt (comme éveillé de la plume) quand l'objet (dans votre cas 'tableView') n'était pas encore instancié – catsby

+0

C'est probablement ça. J'appelle setSortDescriptors dans windowControllerDidLoadNib (j'ai peut-être pensé par erreur que c'était le bon endroit pour faire ce genre de chose dans une application basée sur un document). Je viens de cocher, et après avoir appelé [myTableView setSortDescriptors], [myTabeView sortDescriptors] retourne néant. Où (quand) est le bon endroit (temps) pour faire ce genre d'appel (ou devrais-je poser une nouvelle question concernant l'ordre des choses au lancement de la fenêtre?) Merci! – notMyScreenName

+0

Suivi: J'ai déplacé l'appel à setSortDescriptors dans une méthode de pression de bouton. L'appel de setSortDescriptors par programme provoque l'appel de sortDescriptorsDidChange, mais le fait de cliquer sur l'en-tête de la colonne de tableau ne l'est toujours pas. Dois-je encore définir autre chose pour que cela fonctionne (une action pour cliquer sur l'en-tête de colonne ou quelque chose)? J'ai pensé à la lecture de la documentation qu'une telle chose n'était pas nécessaire. – notMyScreenName

Répondre

0

cela devrait fonctionner sans cela mais avez-vous essayé d'envoyer les notifications KVO vous-même?

[tableView willChangeValueForKey:@"sortDescriptors"]; 
[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]]; 
[tableView didChangeValueForKey:@"sortDescriptors"]; 

si vous ne voulez pas ajouter les descripteurs IB que vous pouvez faire quelque chose comme ça

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)theColumn row:(NSInteger)rowIndex { 
    //if we have no sort descriptor for this column create one based on it's identifier (instead of setting it for each in IB,saves time and prevents errors) 
    NSSortDescriptor *desc = [theColumn sortDescriptorPrototype]; 
    if ([desc key] == nil) { 
     NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:[theColumn identifier] ascending:YES]; 
     [theColumn setSortDescriptorPrototype:sorter]; 
     [sorter release]; 
    } 
}