附加到NSTextView

Dr.*_*eon 2 cocoa scroll append objective-c nstextview

我有一个NSTask(有一个NSPipe设置)在后台运行,我想输出内容,因为他们进来,在NSTextView(output).

我正在使用的代码是:

NSMutableAttributedString* str = [[NSMutableAttributedString alloc] initWithString:s];
//[str addAttribute:NSForegroundColorAttributeName value:[NSColor whiteColor] range:NSMakeRange(0, [str length])];

[[output textStorage] appendAttributedString:str];

[output scrollRangeToVisible:NSMakeRange([[output string] length], 0)];
Run Code Online (Sandbox Code Playgroud)

问题:

  • 当附加大量数据时,视图似乎"闪烁" ......并且无法正常工作.
  • 鉴于它NSTextView位于工作表上,当鼠标指针位于其他地方而不是悬停在其上方时,似乎没有显示任何内容NSTextView
  • 为什么这样,虽然我已经设置了颜色/插入颜色NSTextView,但这似乎不适用于新插入的文本?
  • 什么是追加(+滚动)的建议的方式NSTextView

谢谢!

Ext*_*ire 8

请记住,用户界面元素,包括NSTextView,在主线程上做了他们的魔术.如果您尝试向文本视图添加信息,那么您最好这样做.这是如何做:

[[output textStorage] performSelectorOnMainThread:@selector(appendAttributedString:) 
                                       withObject:str 
                                    waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我会谈到你的第三点,但坦率地说,这是我仍然非常学生的事情.

为了解决你的第四点,看起来你已经弄清楚了; 只需合并你的追加和滚动动作.但就像更改内容一样textStorage,您希望确保在主线程上执行此操作.由于-scrollRangeToVisible:不为其参数提供对象,因此必须以不同的方式执行此操作:

dispatch_async(dispatch_get_main_queue(), ^{
    [output scrollRangeToVisible:NSMakeRange([[output string] length], 0)];
});
Run Code Online (Sandbox Code Playgroud)

尽管我是第一个例子,你也可以把你的电话-appendAttributedString:放在那个街区内:

dispatch_async(dispatch_get_main_queue(), ^{
    [[output textStorage] appendAttributedString:str];
    [output scrollRangeToVisible:NSMakeRange([[output string] length], 0)];
});
Run Code Online (Sandbox Code Playgroud)