Быстрый вопрос относительно преобразования единиц - PullRequest
2 голосов
/ 15 июня 2011

Я использую следующий код для отображения килограмм в фунтах для моих данных в таблице.

По какой-то причине он работает неправильно и дает мне огромные цифры.Есть идеи?

Я использую DDUnitConverter (https://github.com/davedelong/DDUnitConverter)

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSString *repsText = [[managedObject valueForKey:@"reps"] description];

    NSNumber *weightInPounds = [NSNumber numberWithFloat:[[managedObject valueForKey:@"weight"]floatValue]];
    NSNumber *weightInKilos = [[DDUnitConverter massUnitConverter] convertNumber:weightInPounds fromUnit:DDMassUnitUSPounds toUnit:DDMassUnitKilograms];

    NSString *weightText = nil;
    NSString *cellText = nil;
    BOOL isKgs = [[NSUserDefaults standardUserDefaults] boolForKey:@"wantsKGs"];
    if (isKgs == 1)
    {
        weightText = [[NSString alloc]initWithFormat:@"%i", weightInKilos];
        cellText = [[NSString alloc]initWithFormat:@"Set %i: %@ reps at %@ kgs",indexPath.row + 1, repsText, weightText];
    }
    else
    {
        weightText = [[NSString alloc]initWithFormat:@"%i", weightInPounds];
        cellText = [[NSString alloc]initWithFormat:@"Set %i: %@ reps at %@ lbs",indexPath.row + 1, repsText, weightText];
    }
    cell.textLabel.text = cellText;
}

1 Ответ

2 голосов
/ 15 июня 2011

О, эту проблему легко решить. weightInKilos и weightInPounds являются NSNumber экземплярами. Когда вы используете форматер %i в форматах, это означает, что вы вводите целое число. Целое число, которое вы в итоге предоставляете, является значением указателя для каждого объекта. Поскольку вы хотите получить строковое значение каждого NSNumber, используйте метод экземпляра -stringValue.

Вот обновленная версия вашего кода на основе этих изменений.

- (void) configureCell: (UITableViewCell *) cell atIndexPath: (NSIndexPath *) indexPath
{
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath: indexPath];
    NSString *repsText = [[managedObject valueForKey: @"reps"] description];

    NSNumber *weightInPounds = [NSNumber numberWithFloat: [[managedObject valueForKey: @"weight"] floatValue]];
    // Alternatively you could just use ‘[managedObject valueForKey: @"weight"]’ if the ‘weight’ attribute is a number.

    NSNumber *weightInKilos = [[DDUnitConverter massUnitConverter] convertNumber: weightInPounds
                                                                        fromUnit: DDMassUnitUSPounds
                                                                          toUnit: DDMassUnitKilograms];

    BOOL isKgs = [[NSUserDefaults standardUserDefaults] boolForKey:@"wantsKGs"];
    NSString *weightText = (isKgs ? [weightInKilos stringValue] : [weightInPounds stringValue]);

    cell.textLabel.text = [NSString stringWithFormat: @"Set %i: %@ reps at %@ lbs",indexPath.row + 1, repsText, weightText];
}

Помните, что при работе с объектами вы должны соблюдать правила управления памятью. Когда вы создаете объект с использованием метода -init..., вы должны обязательно его освободить. В вашем коде это означает weightText и cellText.

PS: DDUnitConverter - отличная находка. Мне придется оставить его в закладке, если он мне понадобится в будущих проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...