nstextview заменяет вкладки пробелом во время вставки

У меня есть подклассы NSTextView, и я хотел бы изменить пользовательский ввод (в зависимости от предпочтений), чтобы заменить вкладки пробелами. До сих пор я изменил метод insertTab примерно так:

- (void) insertTab: (id) sender
{
    if(shouldInsertSpaces) {
        [self insertText: @"    "];
        return;
    }

    [super insertTab: sender];
}

Но я также хочу заменить пробелы во время события вставки. Одним из решений, о котором я подумал, было изменить метод NSTextStorage replaceCharacter:with:, но я обнаружил, что это заменяет текст, если я загружаю данные в текстовое представление. В частности, я хочу только изменить текст, который пользователь вводит вручную.

Решение найдено здесь предлагает изменить монтажный стол, но я не хочу этого делать, так как не хочу испортить монтажный стол пользователей, если они захотят вставить куда-нибудь еще. Есть ли у кого-нибудь другие предложения относительно того, как я могу это сделать?


person Niki    schedule 15.10.2016    source источник


Ответы (1)


Как упоминалось в другом вопросе, посмотрите на readSelectionFromPasteboard:type:. Переопределите его и замените монтажный стол. Например:

- (BOOL)readSelectionFromPasteboard:(NSPasteboard *)pboard type:(NSString *)type {
    id data = [pboard dataForType:type];
    NSDictionary *dictionary = nil;
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithRTF:data documentAttributes:&dictionary];
    for (;;) {
        NSRange range = [[text string] rangeOfString:@"\t"];
        if (range.location == NSNotFound)
            break;
        [text replaceCharactersInRange:range withString:@"    "];
    }
    data = [text RTFFromRange:NSMakeRange(0, text.length) documentAttributes:dictionary];
    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName:@"MyNoTabsPasteBoard"];
    [pasteboard clearContents];
    [pasteboard declareTypes:@[type] owner:self];
    [pasteboard setData:data forType:type];
    return [super readSelectionFromPasteboard:pasteboard type:type];
}
person Willeke    schedule 16.10.2016