在Cocoa中显示日志记录输出

时间:2009-02-12 17:10:40

标签: cocoa pyobjc

使用Cocoa组件显示不断更新的日志记录输出的最佳方法是什么?输出是基于行的,由应用程序生成。附加行应该很快,视图应自动滚动到底部。总而言之,它应该工作并且看起来像终端中的基本标准。

我的代码是用Python编写的,使用PyObjC桥。我正在寻找可以适应的方法/示例,欢迎使用Objective-C代码。

1 个答案:

答案 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))

强制封闭滚动视图滚动到结尾(indirectoy)