English 中文(简体)
在Cocoa中显示日志输出
原标题:
  • 时间:2009-02-12 17:10:39
  •  标签:

使用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))

问题回答

暂无回答




相关问题
热门标签