2009-02-12 2 views
2

Каков наилучший способ отображения постоянно обновляемого вывода журнала с использованием компонентов Cocoa? Вывод основан на линии и генерируется приложением. Добавляемые строки должны быть быстрыми, и представление должно автоматически прокручиваться донизу. В целом, он должен работать и выглядеть как базовый стандарт в терминале.Вывод журнала регистрации в Cocoa

Мой код написан на Python с использованием моста PyObjC. Я ищу подходы/примеры, которые я могу адаптировать, код Objective-C приветствуется.

ответ

4

Кажется, что существует два варианта: (1) использовать NSTableView и (2) использовать NSTextView. Console.app, похоже, использует NSTableView, но NSTextView, вероятно, меньше кода.

Для (1) я бы написал источник NSTableDataSource, который возвращает соответствующую строку (из памяти или с диска) для tableView_objectValueForTableColumn_rowIndex_ и общее количество строк журнала для numberOfRowsInTableView_. Установите этот источник данных в качестве источника данных для NSTableView. Возможно, вам нужно будет позвонить tableView.reloadData(), чтобы повторно отобразить данные, когда приходит новая строка журнала. Предполагая, что представление таблицы встроено в NSScrollView (по умолчанию, если вы создаете представление таблицы в Interface Builder), вы можете прокручивать нижнюю часть с помощью этого метода от компании Apple Руководства по программированию Scroll View (легко переведен на Python)

- (void)scrollToBottom:sender; 
{ 
    NSPoint newScrollOrigin; 

    // assume that the scrollview is an existing variable 
    if ([[scrollview documentView] isFlipped]) { 
     newScrollOrigin=NSMakePoint(0.0,NSMaxY([[scrollview documentView] frame]) 
             -NSHeight([[scrollview contentView] bounds])); 
    } else { 
     newScrollOrigin=NSMakePoint(0.0,0.0); 
    } 

    [[scrollview documentView] scrollPoint:newScrollOrigin]; 

} 

Очевидно, что этот код предполагает, что у вас есть IBOutlet с видом прокрутки.

Для (2) вы можете добавить строку в конец текстового вида с помощью textView.textStorage().appendString_(new_log + '\n') (при условии, что на конце нет новой строки). Вы можете принудительно закрыть окно прокрутки до конца (косвенно), вызвав textView.setSelectedRange_(NSMakeRange(textView.textStorage().length(),0))

+0

Для опции 2 вы должны использовать 'textView.textStorage(). AppendAttributedString_ (NSAttributedString.alloc(). InitWithString_ (new_log + u" \ n ")', и прокрутка, похоже, не работает для меня. Кроме того, может быть целесообразно вызвать 'beginEditing()' и 'endEditing()' в 'textStorage()' до и после редактирования строки. – Patrick

+0

Вместо 'setSelectedRange_', используйте' scrollRangeToVisible_'. См. Http://stackoverflow.com/questions/15546808/scrolling-nstextview-to-bottom – Patrick

Смежные вопросы