1

Это NSTableView с привязками IB к NSArrayController, он отображает все значения правильно.
Однако он сортирует числа только по их первому значению char, например. не будет ставить 115.31 ниже 2,5 и 23,9 ниже 4,71 и т.д.NSTableColumn неправильно сортирует числа

Он принимает значения от удерживаемой NSMutableArray со строками в этом, я также пытался путем преобразования все строки в NSNumber/NSDecimalNumber, до сих пор не повезло:

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

NSMutableArray *array1alt = [NSMutableArray array]; 

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

Пожалуйста, помогите, спасибо.

EDIT: Это как NSMutableArray (s) моего NSTableColumn (ов) заполняются:

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

Что источник данных здесь? NSArrayController, заполненный номерами строк или NSMutableArray, заполненными цифрами? В любом случае, в цикле for, вы не можете назначить NSString для NSNumber без какого-либо преобразования. –

ответ

1

Я удивлен, что вы не получаете предупреждения компилятора по адресу:

NSNumber *number = strNum; 

Вы, вероятно, хотите:

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

Или, более просто:

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

Если вы не хотите иметь дело с числом переходов на выходе, можно отсортировать исходный массив строк так:

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; 
}]; 

Если вы хотите используйте десятичные числа, вы, вероятно, могли бы сделать что-то вроде:

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

Да, спасибо, что делает трюк! Но теперь у меня есть некоторые разбросанные числа, которые отображают слишком много цифр после десятичного разряда, как я могу это исправить? –

+0

Да, я использовал этот метод http: // stackoverflow.com/questions/4026135/limit-a-double-to-two-decimal-places-without-trailing-zeros, но он также по-прежнему показывает сдержанно некоторые числа с нагрузками после десятичных цифр. –

+0

Теперь проблема в том, что это тоже похоже, потому что я заполняю NSTableView только NSMutableDictionary (содержащий NSMutableArrays для столбцов), позволяя приложению сортировать сами данные, делает все это неправильным, значения в столбцах не совпадают с другими столбцами данные. BTW Я использую повторный NSTimer при повторной загрузке и перезагрузке NSTableView. –

0

Не видя больше кода, это то, что я думаю:

Если я правильно понял, у вас есть NSArrayController в качестве источника данных.

Вам необходимо отсортировать данные перед тем, как прикрепить их к своему столу.

Вы NSArrayController методы:

- (void)setSortDescriptors:(NSArray *)sortDescriptors

и

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

При этом вы получите отсортированный массив использовать для таблицы. Возможно, вам нужно будет позвонить reloadData вашего NSTableView.

Я не могу проверить это прямо сейчас, потому что я нахожусь на моем ноутбуке, который сейчас не имеет MacOS :)

Смежные вопросы