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