NSTextView, NSTextStorage и круговой журнал?

У меня есть NSTextView в окне приложения, которое показывает журнал входящих данных последовательного порта. Я добавляю текст в журнал по мере его поступления в приложение:

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

Я хочу ограничить текст, например, до 1000 строк, чтобы не свернуть приложение, потому что оно будет работать бесконечно.

Теперь у меня есть временное решение, основанное на NSTimer, который очищает журнал каждую неделю, и это работает, но я предпочитаю реализовать умный метод, просто ограничивая размер текста и создавая циклический журнал.

Есть идеи ? Может быть, используя метод insertAttributedString?

С уважением, Джоан


person joanba    schedule 30.01.2013    source источник


Ответы (1)


Наконец, я нашел способ, когда я добавляю текст в 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];
}

Работает круговым бревном, как я и хотел.

person joanba    schedule 26.02.2013