使用Cocoa组件显示不断更新的日志记录输出的最佳方法是什么?输出是基于行的,由应用程序生成。附加行应该很快,视图应自动滚动到底部。总而言之,它应该工作并且看起来像终端中的基本标准。
我的代码是用Python编写的,使用PyObjC桥。我正在寻找可以适应的方法/示例,欢迎使用Objective-C代码。
答案 0 :(得分:4)
似乎有两种选择:(1)使用NSTableView和(2)使用NSTextView。 Console.app似乎使用NSTableView,但NSTextView的代码可能更少。
对于(1),我会编写一个NSTableDataSource,它返回tableView_objectValueForTableColumn_rowIndex_
的相应行(来自内存或来自磁盘)以及numberOfRowsInTableView_
的日志行总数。将此数据源设置为NSTableView的dataSource。当新的日志行进入时,您可能需要调用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))