2

What is the best way to display constantly updated logging output using Cocoa Components? The output is line-based and generated by the application. Appending lines should be fast, and the view should automatically scroll to the bottom. All in all, it should work and look like basic standard out in a terminal.

My code is written in Python, using the PyObjC bridge. I'm looking for approaches/examples I can adapt, Objective-C code is welcome.

4

1 に答える 1

4

(1) NSTableView を使用する方法と (2) NSTextView を使用する方法の 2 つのオプションがあるようです。Console.app は NSTableView を使用しているように見えますが、NSTextView はおそらく少ないコードです。

(1) の場合、(メモリまたはディスクから) の適切な行tableView_objectValueForTableColumn_rowIndex_と のログ行の総数を返す NSTableDataSource を作成します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')まだ改行がない場合)。呼び出して、囲んでいるスクロール ビューを強制的に最後までスクロールすることができます (indirectoy)。textView.setSelectedRange_(NSMakeRange(textView.textStorage().length(),0))

于 2009-02-12T18:40:20.423 に答える