使用Cocoa组件展示实时更新的日志输出的最佳方法是什么?输出是基于行的,并由应用程序生成。追加行应该很快,并且该视图应自动滚动到底部。总体而言,它应该像终端中的基本标准输出一样工作和外观。
我的代码是用Python编写的,使用PyObjC桥接器。我正在寻找可以调整的方法/示例,Objective-C代码也是可以的。
使用Cocoa组件展示实时更新的日志输出的最佳方法是什么?输出是基于行的,并由应用程序生成。追加行应该很快,并且该视图应自动滚动到底部。总体而言,它应该像终端中的基本标准输出一样工作和外观。
我的代码是用Python编写的,使用PyObjC桥接器。我正在寻找可以调整的方法/示例,Objective-C代码也是可以的。
看起来有两个选项:(1)使用 NSTableView 和(2) 使用 NSTextView。Console.app 似乎使用了 NSTableView,但 NSTextView 可能的代码更少。
对于(1),我会编写一个NSTableDataSource,返回适当的行(从内存或磁盘)用于tableView_objectValueForTableColumn_rowIndex_
,以及日志行的总数用于numberOfRowsInTableView_
。将此数据源设置为NSTableView的数据源。当新的日志行出现时,您可能需要调用tableView.reloadData()
来重新显示数据。假设表视图嵌入在NSScrollView中(如果您在Interface Builder中创建表视图,则为默认设置),您可以使用Apple Scroll View Programming Guide中的此方法(轻松转换为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 指向滚动视图。
For (2), you can add a line to the end of the text view with textView.textStorage().appendString_(new_log +
)
(assuming there isn t already a newline on the end). You can force the enclosing scroll view to scroll to the end (indirectoy) by calling textView.setSelectedRange_(NSMakeRange(textView.textStorage().length(),0))