簡體   English   中英

NSTableColumn錯誤地對數字排序

[英]NSTableColumn sorts numbers wrongly

這是一個具有IB綁定到NSArrayController的NSTableView,它正確顯示了所有值。
但是,它僅按數字的第一個char值對其進行排序,例如,它將使115.31低於2.5,而23.9低於4.71,依此類推。

它從保留的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];
}

請幫忙,謝謝。

編輯:這就是我的NSTableColumn的NSMutableArray(s)的填充方式:

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

我很驚訝您在以下位置沒有收到編譯器警告:

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

沒有看到更多的代碼,這就是我的想法:

如果我正確理解,則可以將NSArrayController用作數據源。

您需要先對數據進行排序,然后再將其附加到表中。

您有NSArrayController方法:

- (void)setSortDescriptors:(NSArray *)sortDescriptors

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

這樣,您將獲得用於表的排序數組。 也許您需要調用NSTableView的reloadData

我現在無法測試這些內容,因為我現在正在使用沒有MacOS的筆記本電腦:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM