gpt4 book ai didi

objective-c - append 到 NSTextView

转载 作者:行者123 更新时间:2023-12-03 16:24:46 30 4
gpt4 key购买 nike

我有一个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)];
<小时/>

问题:

  • 当 append 大量数据时, View 看起来“闪烁”...并且无法正常工作。
  • 鉴于NSTextView在工作表上,当鼠标指针位于除 NSTextView 上方以外的其他位置时,似乎不会出现任何内容
  • 为什么会这样,尽管我已经设置了NSTextView颜色/插入颜色/等等,这似乎不适用于新插入的文本?
  • NSTextView 上 append (+滚动)的建议方式是什么? ?

谢谢!

最佳答案

请记住,用户界面元素(包括 NSTextView)在主线程上发挥作用。如果您尝试向 TextView 添加信息,那么您最好在 TextView 中执行此操作。方法如下:

[[output textStorage] performSelectorOnMainThread:@selector(appendAttributedString:) 
withObject:str
waitUntilDone:YES];

我想谈谈你的第三点,但坦率地说,我仍然是一个学生。

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

dispatch_async(dispatch_get_main_queue(), ^{
[output scrollRangeToVisible:NSMakeRange([[output string] length], 0)];
});

尽管是我的第一个示例,您也可以将调用 -appendAttributedString: 放在该 block 内:

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

关于objective-c - append 到 NSTextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993008/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com