Objective c NSTextView滚动行为和选择行为

Objective c NSTextView滚动行为和选择行为,objective-c,cocoa,nstextview,Objective C,Cocoa,Nstextview,我有一个NSTextView,我正在从NSTask输出文本。除滚动和选择行为外,所有操作均按预期进行 1:如果我尝试向上滚动,我的滚动位置会在我松开后立即回到底部。有什么想法吗?我已经查阅了很多关于这方面的文档,但找不到任何相关内容 2:如果我选择文本,它将删除它。我只想选择它,这样我就可以复制和粘贴。这一次我也迷路了 任何提示或指点都是非常受欢迎的。谢谢 - (id)init { [super init]; [[NSNotificationCenter defaultCente

我有一个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];
    }
}

请尝试此操作,而不是
插入文本:

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))];
}

当您从任务中获得输出时,是否在文本视图中替换整个文本?请编辑问题并发布用于获取任务输出的代码,并将其添加到文本视图。已更新。根据NSTextView的文档。。。如果在视图中未选择任何内容,它将附加下一个传入字符串。如果有选定的文本。。。它将取代它。除了前两个问题外,一切都正常。很好!那太好了!!唯一的缺点是,它不会自动滚动到底部的新输出。我修改了我的答案,但这只是一个猜测。宾果!我得把你在这里做的事细说一遍。我从未使用过NSTextStorage或NSScroller,所以现在似乎是深入研究文档中这些部分的时候了。非常感谢Rob。看起来您的scroll to bottom实现相当于“如果(滚动在底部),则滚动到底部”对吗?更像是“如果在插入前滚动到底部,然后在插入后滚动到底部”