1

Il s'agit d'une liaison NSTableView avec IB à un NSArrayController, elle affiche toutes les valeurs correctement.
Cependant, il ne trie les nombres que par leur première valeur de caractère, par ex. il mettra 115,31 en dessous de 2,5 et 23,9 ci-dessous 4,71, etc.NSTableColumn trie des nombres incorrectement

Il prend des valeurs d'une retenue NSMutableArray avec des chaînes en elle, j'ai essayé aussi en convertissant toutes les chaînes à NSNumber/NSDecimalNumber, toujours pas de chance:

NSMutableArray *array1 = [[string1 componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]] mutableCopy]; 

NSMutableArray *array1alt = [NSMutableArray array]; 

for(NSString *strNum in array1) 
{ 
    NSNumber *number = strNum; 
    [array1alt addObject:number]; 
} 

S'il vous plaît, aidez, merci.

EDIT: Voici comment NSMutableArray (s) de mon NSTableColumn (s) se remplissent:

NSMutableArray *rows = [NSMutableArray array]; 

for (NSUInteger i = 0; i < array1alt.count && i < array2.count && i < array3.count && i < array4.count; i++) 
{ 
    NSMutableDictionary *row = [NSMutableDictionary dictionary]; 
    [row setObject:[array1alt objectAtIndex:i] forKey:@"Apples"]; 
    [row setObject:[array2 objectAtIndex:i] forKey:@"Oranges"]; 
    [row setObject:[array3 objectAtIndex:i] forKey:@"Peaches"]; 
    [row setObject:[array4 objectAtIndex:i] forKey:@"Plums"]; 
    [rows addObject:row]; 
} 

[myArrayController2 setContent:rows2]; 
[aTableView reloadData]; 
+0

Quelle est votre source de données ici? Un NSArrayController rempli de nombres de chaînes ou NSMutableArray rempli de nombres? D'une manière ou d'une autre, dans la boucle for, vous ne pouvez pas affecter NSString à NSNumber sans qu'une conversion ait lieu. –

Répondre

1

Je suis surpris que vous ne recevez pas un avertissement du compilateur à:

NSNumber *number = strNum; 

Vous voulez probablement:

NSNumber *number = [NSNumber numberWithDouble:[strNum doubleValue]]; 

Ou, plus simplement:

NSNumber *number = @([strNum doubleValue]); 

Si vous ne voulez pas traiter avec des conversions numériques de la sortie, vous pouvez trier votre tableau original de chaînes comme ceci:

NSArray *array2 = [array1 sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { 
    double num1 = [obj1 doubleValue]; 
    double num2 = [obj2 doubleValue]; 
    if (num1 < num2) 
     return NSOrderedAscending; 
    else if (num1 > num2) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
}]; 

Si vous voulez utiliser des nombres décimaux, vous pouvez probablement faire quelque chose comme:

NSMutableArray *array2 = [NSMutableArray array]; 
for (NSString *strNum in array1) 
{ 
    [array2 addObject:[NSDecimalNumber decimalNumberWithString:strNum]]; 
} 

[array2 sortUsingComparator:^NSComparisonResult(NSDecimalNumber *obj1, NSDecimalNumber *obj2) { 
    return [obj1 compare:obj2]; 
}]; 
+0

Oui, merci ça fait l'affaire! Mais j'ai maintenant quelques numéros dispersés qui affichent beaucoup trop de chiffres post-décimaux, comment puis-je résoudre ce problème? –

+0

Oui, j'ai utilisé cette méthode http: // stackoverflow.com/questions/4026135/limit-a-double-to-two-decimal-places-without-trailing-zeros mais il montre aussi encore quelques chiffres avec beaucoup de chiffres post-décimaux. –

+0

Maintenant, le problème est, semble-t-il, car je ne remplis que NSTableView avec NSMutableDictionary (contenant NSMutableArrays pour les colonnes), laissant l'application trier les données elle-même, rend tout faux, les valeurs des colonnes ne correspondent pas aux autres colonnes Les données. BTW J'utilise un NSTimer répété pour repeupler et recharger le NSTableView. –

0

Sans voir plus de code voici ce que je pense:

Si j'ai bien compris, vous avez votre NSArrayController comme source de données.

Vous devez trier vos données avant de les attacher à votre table.

Vous avez NSArrayController méthodes:

- (void)setSortDescriptors:(NSArray *)sortDescriptors

et

- (NSArray *)arrangeObjects:(NSArray *)objects

Avec cela, vous obtiendrez tableau trié à utiliser pour votre table. Peut-être que vous aurez besoin d'appeler reloadData de votre NSTableView.

Je ne peux pas tester ces maintenant parce que je suis à mon ordinateur portable en ce moment qui ne dispose pas Mac OS :)