Поведение прокрутки NSTextView и выбор поведения

У меня есть NSTextView, в котором я вывожу текст из NSTask. Все работает так, как ожидалось, за исключением поведения прокрутки и выбора.

1: Если я попытаюсь прокрутить вверх, положение моей прокрутки мгновенно вернется к нижней части после того, как я отпущу. Любые идеи? Я просмотрел довольно много документации по этому поводу и ничего не могу найти об этом.

2: Если я выбираю текст, он удаляет его. Я просто хочу выбрать, чтобы я мог копировать и вставлять. На этом тоже проиграл.

Любые советы или указатели будут приветствоваться. Спасибо.

- (id)init
{
    [super init];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(readPipe:)
                                                 name:NSFileHandleReadCompletionNotification 
                                               object:nil];

    return self;
}

- (void)kicked
{
    task = [[NSTask alloc] init];

    [task setLaunchPath:[self.kickLocationTextField stringValue]];
    [task setArguments:kickBuild];

    NSPipe *pipe = [[NSPipe alloc] init];
    fileHandle = [pipe fileHandleForReading];
    [fileHandle readInBackgroundAndNotify];

    [task setStandardOutput:pipe];
    [task setStandardError:pipe];

    [task launch];

    [task release];
    [pipe release];
}


- (void)readPipe:(NSNotification *)notification
{
    NSData *data;
    NSString *text;

    if( [notification object] != fileHandle )
    {
        return;
    }

    data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    [nsTaskOutput insertText:text];

    [text release];
    if (data != 0)
    {
        [fileHandle readInBackgroundAndNotify];
    }
}

person crewshin    schedule 05.11.2011    source источник
comment
Вы заменяете весь текст в текстовом представлении всякий раз, когда получаете результат задачи? Пожалуйста, отредактируйте вопрос и опубликуйте код, который вы используете, чтобы получить результат задачи и добавить его в текстовое представление.   -  person    schedule 06.11.2011
comment
Обновлено. Согласно документам для NSTextView... если в представлении ничего не выбрано, оно добавит следующую входящую строку. Если есть выделенный текст... он заменит его. Все работает так, как ожидалось, за исключением двух предыдущих вопросов.   -  person crewshin    schedule 06.11.2011


Ответы (1)


Попробуйте это вместо insertText::

NSScroller *scroller = nTaskOutput.enclosingScrollView.verticalScroller;
BOOL shouldScrollToBottom = scroller.doubleValue == 1.0;
NSTextStorage *ts = nTaskOutput.textStorage;
[ts replaceCharactersInRange:NSMakeRange(ts.length, 0) withString:text];
if (shouldScrollToBottom) {
    NSRect bounds = nTaskOutput.bounds;
    [nTaskOutput scrollPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds))];
}
person rob mayoff    schedule 06.11.2011
comment
НИЦЦА! Это отлично работает!! Единственным недостатком является то, что он автоматически не прокручивается вниз с новым выводом. - person crewshin; 06.11.2011
comment
Я изменил свой ответ, но это всего лишь предположение. - person rob mayoff; 06.11.2011
comment
Бинго! Я должен разбить то, что вы сделали здесь. Я никогда не использовал NSTextStorage или NSScroller, так что, похоже, пришло время покопаться в этих разделах документации. Большое спасибо, Роб. - person crewshin; 07.11.2011
comment
Похоже, ваша реализация прокрутки вниз эквивалентна if (прокрутка внизу), а затем прокрутка вниз правильно? - person GTAE86; 28.06.2012
comment
Это больше похоже на «если он был прокручен вниз перед вставкой, то прокрутите вниз после вставки». - person rob mayoff; 25.01.2014