Отключить разрывы строк Option-Enter в NSTextField?

Я хочу запретить ввод символа новой строки в моем NSTextField, что по умолчанию возможно, если ввести Option-Enter (или Option-Return).

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

Как это может быть сделано?


person Yang Meyer    schedule 23.02.2009    source источник


Ответы (3)


Вы можете создать подкласс NSFormatter и реализовать метод isPartialStringValid:... для блокировки новой строки.

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr 
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr 
              originalString:(NSString *)origString 
       originalSelectedRange:(NSRange)origSelRange 
            errorDescription:(NSString **)error
{
    // the user may have:
    // -- deleted the left most character
    // -- deleted the last character and we have an empty string
    // both cases are valid
    if (proposedSelRangePtr->location == 0)
        return YES;

    unichar theChar = [*partialStringPtr characterAtIndex:proposedSelRangePtr->location - 1];

    if ([[NSCharacterSet newlineCharacterSet] characterIsMember:theChar]) {
        *error = nil;
        NSBeep();
        return NO;
    }

    return YES;
}
person Nathan Kinsinger    schedule 24.02.2009
comment
Уф, похоже, отключить ввод разрывов строк было на удивление громоздко! Попробую ваше решение, спасибо! - person Yang Meyer; 26.02.2009

Могу я спросить, почему вы хотите отключить эту функцию? Это довольно стандартная часть ОС. Имейте в виду, что пользователь вполне может вставить какую-либо строку из другого места, содержащую разрыв строки, и затем отредактировать ее в соответствии со своими потребностями. Возможно, было бы лучше оставить эту функцию нетронутой, но использовать NSFormatter для удаления всего после разрыва строки, когда пришло время скопировать значение из представления в модель?

person Community    schedule 01.03.2009

Я делаю следующий код для предотвращения проблемы с разрывом строки в случае использования Control, Option + Enter (Return).

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
    if ((commandSelector == @selector(insertNewlineIgnoringFieldEditor:)) || (commandSelector == @selector(insertLineBreak:)))
    {
        return YES;
    }

    return NO;
}
person lam.nguyen2169    schedule 12.05.2020