Я попробовал это как метод в моем View Controller, но мне бы очень хотелось, чтобы в Label - PullRequest
1 голос
/ 03 июля 2011

Я действительно хочу реализовать категорию, такую ​​как 'UILabel + formattedText', которая позволяет мне выполнять метод, который будет красиво форматировать текст на видимом дисплее метки, но любой код, который смотрит на label.text, просто видит неформатированную числовую строку , Я знаю, что это, вероятно, очень просто. Дело в том, что я не могу найти синтаксис для этого. Как бы это сработало?

Вот мой пример для метода внутри контроллера вида:

- (void)UpdateLabels{
    if(!formatter){//initialize formatter if there isn't one yet.
        formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        [formatter setPositiveFormat:@",##0.##"]; 
        [formatter setNegativeFormat:@",##0.##"];
        [formatter setMaximumFractionDigits:15];
        [formatter setMaximumIntegerDigits:15];

    }
    NSRange eNotation =[rawDisplay rangeOfString: @"e"];//if there's an 'e' in the string, it's in eNotation.
    if ([rawDisplay isEqual:@"Error"]) {
        display.text=@"Error";
        backspaceButton.enabled = FALSE;
    }else if (eNotation.length!=0) {
        //if the number is in e-notation, then there's no special formatting necessary.
        display.text=rawDisplay;
        backspaceButton.enabled =FALSE;
    } else {
        backspaceButton.enabled =([rawDisplay isEqual:@"0"])? FALSE: TRUE; //disable backspace when display is "0"            
        //convert the display strings into NSNumbers because NSFormatters want NSNumbers
        // then convert the resulting numbers into pretty formatted strings and stick them onto the labels
        display.text=[NSString stringWithFormat:@"%@", [formatter stringFromNumber: [NSNumber numberWithDouble:[rawDisplay doubleValue]]]];           
    }
}

Таким образом, я хочу, чтобы по крайней мере функциональность рисования ярлыка была включена в ярлык. Кстати, этот код верен MVC? Это моя первая попытка.

Кроме того, пока я здесь, я могу также спросить: это входит в электронную запись с относительно небольшим числом цифр в виде двойного числа. Но когда я пытаюсь сменить удвоение на что-то другое, например, longlong, я получаю очень странные результаты. Как я могу иметь больше точности и все еще выполнять все эти операции?

1 Ответ

1 голос
/ 03 июля 2011

Я бы предложил написать подкласс UILabel. Поскольку все, что вы хотите сделать, это изменить способ отображения текста, вам просто нужно написать собственный метод drawTextInRect:. Он будет использовать формат значения self.text и нарисует полученную строку. Тогда вам просто нужно изменить класс любой метки, которая должна быть отформатирована.

Пример:

@interface NumericLabel : UILabel {}
@end

@implementation NumericLabel
- (void)drawTextInRect:(CGRect)rect {
    static NSNumberFormatter *formatter;
    NSString *text = nil, *rawDisplay = self.text;

    if(!formatter){
        //initialize formatter if there isn't one yet.
    }
    NSRange eNotation =[rawDisplay rangeOfString: @"e"];//if there's an 'e' in the string, it's in eNotation.
    if ([rawDisplay isEqual:@"Error"]) {
        text = @"Error";
    }else if (eNotation.length!=0) {
        text = rawDisplay;
    } else {
        text=[formatter stringFromNumber: [NSNumber numberWithDouble:[rawDisplay doubleValue]]];           
    }

    [text drawInRect:rect withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment];
}
@end
...