Что такое лучший способ ввода десятичных чисел с iPhone SDK? - PullRequest
2 голосов
/ 23 декабря 2009

Итак, после того, как я, наконец, узнал, как сохранить пользовательский ввод в переменную, я понял, что довольно сложно иметь числа пользовательского ввода с десятичными знаками. Цифровая клавиатура не допускает десятичную часть, и если я использую цифры и знаки пунктуации, она выглядит немного странно.

Так что мне нужно использовать средство выбора номера, чтобы плавно разрешать пользователям вводить числа? ИЛИ я должен просто использовать цифры и знаки пунктуации, так как я смог научиться хранить эти данные (почти)?

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

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

Просто следуйте инструкциям по добавлению и мониторингу кнопки. Единственное, что вам нужно изменить, это от @selector(doneButton:) до @selector(decimalButton:). Ваш метод для десятичной кнопки будет:

- (void)decimalButton: (id) sender {
     myTextField.text = [myTextField.text stringByAppendingString:@"."];
}
1 голос
/ 23 декабря 2009

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

Довольно много работы, но вы также можете настроить внешний вид (с помощью своих собственных приятных кнопок и т. Д.), Что я и хотел для своего приложения.

Обновление : My DecimalKeyboardViewController:

На самом деле я использую подкласс UIControl вместо поля UIText, потому что я отображаю его некоторым пользовательским способом. Если бы я был подклассом UITextfield, я бы сделал что-то вроде этого:

@interface DecimalNumberTextfield : UITextfield {
    NSDecimalNumber *value;
}
@property (nonatomic, retain) NSDecimalNumber *value
@end

@implementation DecimalNumberTextfield
- (BOOL)becomeFirstResponder
{
    if ([super becomeFirstResponder]) {
        [[DecimalKeyboardViewController sharedDecimalKeyboardViewController] showForField:self];
        return YES;
    } else {
        return NO;
    }
}
- (BOOL)resignFirstResponder
{
    if ([super resignFirstResponder]) {
        [[DecimalKeyboardViewController sharedDecimalKeyboardViewController] hide];
        return YES; 
    } else {
        return NO;
    }
}
- (void)setValue:(NSDecimalNumber *)aValue {
    // you need to set value and update the displayed text here
}
@end

Вот DecimalKeyboardViewController. Вам нужно будет создать файл пера и добавить теги к кнопкам (вероятно, цифры от 0 до 9 и другие теги для других кнопок, которые вы будете использовать), затем подключите кнопки к -buttonPressed::

@interface DecimalKeyboardViewController : UIViewController {
    DecimalNumberTextField *fieldBeingEdited;
}
@property (nonatomic, retain) DecimalNumberTextField *fieldBeingEdited;

+ (id)sharedDecimalKeyboardViewController;
- (void)showForField:(DecimalNumberTextField *)aTextField;
- (void)hide;
- (IBAction)buttonPressed:(id)sender;
@end

@implementation DecimalKeyboardViewController
static DecimalKeyboardViewController *sharedViewController;

+ (id)sharedDecimalKeyboardViewController
{
    if (!sharedViewController) {
        sharedViewController = [[DecimalKeyboardViewController alloc]
                                initWithNibName:@"DecimalKeyboardViewController"
                                         bundle:[NSBundle mainBundle]];
    }
    return sharedViewController;
}
- (void)showForField:(DecimalNumberTextField *)aTextField
{
    self.fieldBeingEdited = aTextField;

    // add ourselves to the window unless we're there already
    UIWindow *theWindow = self.fieldBeingEdited.window;
    CGRect frame = self.view.frame;

    if (!self.view.superview) { // add ourselves to the UIWindow unless we're already visible
        frame.origin.y = theWindow.frame.size.height; // we start just out of sight at the bottom
        self.view.frame = frame;
        [theWindow addSubview:self.view];
    }

    // start animating
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    // animate the keyboard in
    frame.origin.y = theWindow.frame.size.height - frame.size.height;
    self.view.frame = frame;

    // GO!
    [UIView commitAnimations];
}
- (void)hide
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    if (self.view.superview) {
        CGRect frame = self.view.frame;
        frame.origin.y = self.view.superview.frame.size.height;
        self.view.frame = frame;
    }

    [UIView commitAnimations];

    self.fieldBeingEdited = nil;    
}
- (IBAction)buttonPressed:(id)sender
{
    UIButton *button = (UIButton *)sender;

    NSDecimalNumber *oldNumber = self.fieldBeingEdited.value;
    NSDecimalNumber *newNumber;

    switch (button.tag) {
        // calculate the new number based on what button the user pressed
    }

    // update the DecimalNumbertextfield
    self.fieldBeingEdited.value = newNumber;
}
@end

Обновление 2 : с тех пор как я вложил в подкласс UIControl, мне не приходилось сталкиваться с появлением стандартной клавиатуры. Если вы подкласс UITextfield, я думаю, что нормальная клавиатура будет отображаться также. Вы должны были бы предотвратить это каким-либо образом (не уверен, как) или подкласс UIControl, как я сделал.

0 голосов
/ 23 декабря 2009

В заметках о выпуске SDK 3.0 Apple написала следующее предупреждение:

Не рисуйте пользовательские кнопки поверх существующих клавиатур. Может возникнуть любое количество проблем с рисованием, событием или совместимостью.

Теперь это правда, что они принимают приложения, которые добавляют кнопку поверх существующей клавиатуры, однако этот метод использует недокументированную ссылку на представление UIKeyboard и может быть легко отклонен при следующей отправке. Технически он попадает в недокументированную область API, однако я не верю, что их автоматизированные инструменты подберут его, чтобы он не был помечен.

Вам следует опубликовать сообщение об ошибке на веб-сайте Apple Developer Connection, так как они подсчитывают количество сообщений об ошибках по этой проблеме, прежде чем они решат ее формально ...

Существует несколько способов исправить это, в том числе:

1) Поддержка более предопределенных параметров клавиатуры (десятичная, валюта и т. Д.). 2) Выставить методы UIKeyboard 3) Предоставить возможность настройки параметров клавиатуры, которые могут быть локализованы

Если вы намерены локализовать свое приложение, у вас будут проблемы с клавиатурой разных размеров, когда вы наложите «.» нажмите на пустое место на одной из существующих клавиатур (та же проблема, что и кнопка «Готово» в этом подходе).

В настоящее время я использую наложение "." в одном из моих собственных приложений и, вероятно, в конечном итоге создаст полностью пользовательскую «десятичную» клавиатуру, чтобы заменить ее, чтобы я не рискнул быть отклоненным в обновлении приложения в будущем.

-t

0 голосов
/ 23 декабря 2009

Если вы не хотите идти с ответом Криса, вы можете использовать цифры и клавиатуру пунктуации, а затем «отключить» все вводы без цифр / десятичных знаков, применяя методы UITextFieldDelegate

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