Заставьте NSFormatter постоянно проверять NSTextFieldCell - PullRequest
4 голосов
/ 19 мая 2010

В Какао у меня есть NSOutlineView, где ячейки - NSTextFieldCell. В ячейке отображаются значения, которые представляют собой строки, отформатированные в соответствии с определенными правилами (например, числа с плавающей запятой или пары чисел с пробелом между ними). Я сделал собственный NSFormatter для проверки текста, и это, похоже, работает без проблем.

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

Я установил как ячейку, так и контурный вид как "непрерывный".

Было бы лучше, если бы я не смог сначала ввести текст в ячейку. Можно ли так сделать, и если да, то как?

1 Ответ

7 голосов
/ 19 мая 2010

Отвечая на мой вопрос, потому что я нашел решение. Существует необязательный метод для переопределения на NSFormatter, и это решает проблему. Необязательный метод:

- (BOOL) isPartialStringValid: (NSString*) partialString
             newEditingString: (NSString**) newString
             errorDescription: (NSString**) error

Здесь можно просто вернуть NO, если partialString недействительно. При желании можно вернуть фиксированную строку по ссылке в newString.

Существует еще один метод, который также можно было бы использовать, но он более сложный:

- (BOOL) isPartialStringValid: (NSString**) partialStringPtr
        proposedSelectedRange: (NSRangePointer) proposedSelRangePtr
               originalString: (NSString*) origString
        originalSelectedRange: (NSRange) origSelRange
             errorDescription: (NSString**) error
...