привязка NSTextField к NSNumber

Сначала необходимо создать унаследованный процесс , а затем отредактировать этот процесс.

enter image description here

5
задан lajos 9 February 2009 в 07:11
поделиться

4 ответа

Я отправляю willChangeValueForKey: и didChangeValueForKey: но UI не обновляет к новым значениям, в то время как то текстовое поле все еще активно.

Существует очень немного причин отправить те сообщения. Обычно, можно сделать то же задание лучше и более чисто путем реализации и использования средств доступа (или, еще лучше, свойства). KVO отправит уведомления за Вами, когда Вы сделаете это.

В Вашем случае Вы хотите или отклонить или отфильтровать поддельные исходные данные (как “12abc”). Корректный инструмент для этой задачи является Проверкой Значения ключа.

Для включения этого установите флажок “Validates Immediately” на привязке в IB и реализуйте метод проверки.

Фильтрация:

- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
    NSString *salvagedNumericPart;
    //Determine whether you can salvage a numeric part from the string; in your example, that would be “12”, chopping off the “abc”.
    *newValue = salvagedNumericPart; //@"12"
    return (salvagedNumericPart != nil);
}

Отклонение:

- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
    BOOL isEntirelyNumeric;
    //Determine whether the whole string (perhaps after stripping whitespace) is a number. If not, reject it outright.
    if (isEntirelyNumeric) {
        //The input was @"12", or it was @" 12 " or something and you stripped the whitespace from it, so *newValue is @"12".
        return YES;
    } else {
        if (outError) {
            *outError = [NSError errorWithDomain:NSCocoaErrorDomain code: NSKeyValueValidationError userInfo:nil];
        }
        //Note: No need to set *newValue here.
        return NO;
    }
}

(Я также заметил, что метод установщика получает NSString, не NSNumber. Это нормально?)

Да, если Вы не используете преобразователь значения, который преобразовывает строки в числа, подключите средство форматирования числа с formatter выход или замена NSNumber для NSString в Вашем методе проверки.

10
ответ дан 18 December 2019 в 14:52
поделиться

Как упомянутый Ben, один способ сделать это должно присоединить NSNumberFormatter к Вашему текстовому полю, которое довольно тривиально для установки в интерфейсном разработчике, и будет, вероятно, Просто Work™.

Если Вам не нравятся модальные диалоговые окна броски NSNumberFormatter в Ваших пользователях, когда они вводят нечисловые значения, можно разделить NSNumberFormatter на подклассы для реализации отличающийся, ‘более прощающее’ поведение форматирования. Я думаю, переопределяя – numberFromString: разделять нечисловые символы прежде, чем назвать реализацию super должно добиться цели.

Другой подход должен создать и зарегистрировать Ваш собственный подкласс NSValueTransformer для парсинга строк в NSNumbers и назад, но я попытался бы использовать NSNumberFormatter сначала, так как это - довольно ясно класс, который был разработан для этой точной цели.

Больше о преобразователях значения

1
ответ дан 18 December 2019 в 14:52
поделиться

Я думаю, что необходимо настроить средство форматирования числа к Вашему NSTextField.

Пойдите чтение о средствах форматирования на веб-сайте Apple: Применение Средств форматирования.

0
ответ дан 18 December 2019 в 14:52
поделиться

Есть важный комментарий к отличному ответу Питера Хоси, который я хотел бы поднять на верхний уровень (потому что я пропустил его при первом проходе).

Если вы хотите проверить / изменяйте NSTextField каждый раз, когда вводится символ, а не только когда пользователь отправляет поле, тогда вы не можете получить то, что хотите, только от привязок. Вам необходимо назначить делегата в текстовое поле, а затем внедрить в делегат - (void) controlTextDidChange: (NSNotification *) aNotification . Это будет вызываться каждый раз, когда текст меняется. Если хотите, вы можете вызвать валидатор значения в controlTextDidChange .

Например:

- (void)controlTextDidChange:(NSNotification *)aNotification
{
    NSError *outError;
    NSControl *textField = [aNotification object];
    NSString *myText = [textField stringValue];

    // myObject is the model object that owns the text in question
    // the validator can modify myText by reference
    [myObject validateValue:&myText error:&outError]];

    // update the NSNextField with the validated text
    [postingObject setStringValue:myText];
}
2
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: