NSTextView,NSTextStorage和循环日志?

时间:2013-01-30 09:54:50

标签: logging size fixed nstextview nstextstorage

我在应用程序窗口中有一个NSTextView,它显示了串行端口传入数据的日志。我在日志到达应用程序时将其附加到日志中:

NSAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString: text];
NSTextStorage *textStorage = [SerialOutput textStorage];
[textStorage beginEditing];
[textStorage appendAttributedString:attrString];
[textStorage endEditing];

我想将文本限制为1000行,以便不会折叠应用程序,因为它将无限期地运行。

现在我有一个临时解决方案,基于NSTimer每周清除日志并且它可以工作但我更喜欢实现一个聪明的方法,只是限制文本大小并创建一个循环日志。

有什么想法吗?也许使用方法insertAttributedString?

此致 琼

1 个答案:

答案 0 :(得分:4)

最后我找到了方法,当我将文本附加到NSTextStorage时,我只是控制长度是否超过阈值并且我清理了日志开头的一些空间:

// updates the textarea for incoming text by appending text
- (void)appendToIncomingText: (id) text {
  // add the text to the textarea
  NSAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString: text];
  NSTextStorage *textStorage = [SerialOutput textStorage];
  [textStorage beginEditing];
  [textStorage appendAttributedString:attrString];
      //Max. size of TextArea: LOG_SIZE characters
      if ([textStorage length] > LOG_SIZE){
          [textStorage deleteCharactersInRange:NSMakeRange(0, [attrString length])];
      }
  [textStorage endEditing];

  // scroll to the bottom
  NSRange myRange;
  myRange.length = 1;
  myRange.location = [textStorage length];
  NS[SerialOutput scrollRangeToVisible:myRange];
}

它可以像我想要的那样用作循环日志。