Заставить все столицы в NSTextField (Какао) - PullRequest
3 голосов
/ 10 января 2010

Есть ли способ заставить прописные в NSTextField?

Я хочу создать текстовое поле для ввода почтовых индексов и хочу, чтобы все введенные почтовые индексы использовали заглавные буквы.

например. N1 3ET вместо: n1 3et

Кроме того, я использую регулярное выражение, которое принимает только заглавные буквы (я очень мало знаю о регулярных выражениях, поэтому я не заинтересован в их изменении)

Спасибо!

Michael

Ответы [ 6 ]

6 голосов
/ 10 января 2010

Вы можете дать NSTextField делегат с чем-то вроде:

- (void)controlTextDidChange:(NSNotification *)aNotification{
    NSText *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
    [fieldEditor setString:[[fieldEditor string] uppercaseString]];
}

Должен отлавливать текст уведомления об изменениях и текст в верхнем регистре.

2 голосов
/ 14 августа 2015

Быстрое решение. Класс, являющийся делегатом NSTextField, должен содержать:

override func controlTextDidChange(obj: NSNotification) 
{
    if let info = obj.userInfo, text = info["NSFieldEditor"] as? NSText,
        string = text.string
    {
        text.string = string.uppercaseString
    }
}
2 голосов
/ 10 января 2010

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

См. Также Руководство по программированию форматирования данных для какао .

0 голосов
/ 07 апреля 2016

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

[VCOUVER]

Я бы поставил курсор на 1:

[V | COUVER]

и введите строчную букву 'a', это произойдет:

[VACOUVER | ]

не замечая этого, я набрал бы 'n' и получил бы:

[VACOUVERN | ]

Дерьмо ... Хорошо, вот мое исправление:

-(void)controlTextDidChange:(NSNotification *)obj {
    if([obj.object isEqualTo:self.locationTextField]) {
        NSText *fieldEditor = [[obj userInfo] objectForKey:@"NSFieldEditor"];
        NSRange rng = [fieldEditor selectedRange];
        [fieldEditor setString:[[fieldEditor string] uppercaseString]];
        [fieldEditor setSelectedRange:rng];
    }
}

То есть перед применением верхнего регистра захватите положение курсора, примените верхний регистр, а затем верните курсор назад.

0 голосов
/ 03 июня 2015

Крюк NStexfield для делегирования в IB чем:

- (void)controlTextDidChange:(NSNotification *)aNotification{
  editField = [aNotification object];
  NSString* value = [editField stringValue];
  [editField setStringValue:[value uppercaseString]];
  //NSLog(@"editField%@", editField.stringValue);

}
0 голосов
/ 20 сентября 2014

Вот как сделать то же самое, что и ответ Анка в Swift

override func controlTextDidChange(obj: NSNotification!) {
    //Make the username all caps to match the PM
    var infoDictionary:Dictionary = obj.userInfo! as Dictionary
    var text:NSText = infoDictionary["NSFieldEditor"] as NSText;
    text.string = text.string.uppercaseString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...