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位于工作表上,当鼠标指针位于其他地方而不是悬停在其上方时,似乎没有显示任何内容NSTextViewNSTextView,但这似乎不适用于新插入的文本?NSTextView?谢谢!
请记住,用户界面元素,包括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)