web-dev-qa-db-ja.com

プログラムでNSTableViewを作成する(NSHeaderViewを表示するのに問題があります)(cocoa osx)

プログラムでNSTableViewを作成していますが、何らかの理由で、darnheaderViewを表示できません。私は実際にこのウィジェットをIDEココアブリッジを含むLISPideであるclozureclと呼ばれる)で開発しているため、これをプログラムで実行し、IBを使用しないことが不可欠です。問題は私の開発環境が原因である可能性がありますが、Objective Cのみを使用してXcodeで例を作成したところ、問題が解決しないようです。私が行うことは非常に簡単です。

IBとそのawkefromnibメソッドでウィンドウを作成し、テーブルを作成して設定します。コードは次のとおりです。

- (void)awakeFromNib {
mydatasource *data = [[mydatasource alloc] init];
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"];
NSTableView *table = [[NSTableView alloc] initWithFrame: [[self                      

   contentView]frame]];
[table setDataSource:data];
[table addTableColumn:column];
[table addTableColumn:column];
[[self contentView] addSubview:table];
}

データソースオブジェクトのコードは次のとおりです。

- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
printf("NUM ROwS");
    return 4;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn    *)aTableColumn row:(NSInteger)rowIndex
{
 printf("THE OTHER ONE"); 
 return @"OKAY";
}

このコードを使用すると、2つの列と4つの行があり、各セルに文字列「OKAY」が表示されたウィンドウが表示されます。テーブルにヘッダーがないことを除けば、これはすべて問題ありません。これは、tablesヘッダーメソッドを見ると、値が意味のあるフレームで初期化されたヘッダーがある場合を除いて、意味があるかもしれません。なぜ私はそれを見ないのか疑問に思っています。ヘッダーが表示されるようにするために必要な特別な種類の魔法はありますか?ドキュメントに手がかりが見つからないようです。繰り返しになりますが、これはプログラムで行うことがLISP ideにとって不可欠であるため、headerViewが機能することがわかっているIBの使用を提案することは役に立ちません。どうもありがとう。

31
Mike2012

これは、スクロールバーと複数の列を備えたテーブルビューをプログラムで作成するためのコードです。

// create a table view and a scroll view
NSScrollView * tableContainer = [[NSScrollView alloc] initWithFrame:NSMakeRect(10, 10, 380, 200)];
NSTableView * tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, 364, 200)];
// create columns for our table
NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"Col1"];
NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"Col2"];
[column1 setWidth:252];
[column2 setWidth:198];
// generally you want to add at least one column to the table view.
[tableView addTableColumn:column1];
[tableView addTableColumn:column2];
[tableView setDelegate:self];
[tableView setDataSource:self];
[tableView reloadData];
// embed the table view in the scroll view, and add the scroll view
// to our window.
[tableContainer setDocumentView:tableView];
[tableContainer setHasVerticalScroller:YES];
[[self contentView] addSubview:tableContainer];
[tableContainer release];
[tableView release];
[column1 release];
[column2 release];

まだ率直な答えを探している人のためにこれを投稿すると思っただけです。 :)

61
Alex Nichol

私はこれを書いたSwift @Alex Nicholの答えのバージョン:

    let tableContainer = NSScrollView(frame:NSMakeRect(10, 10, 380, 200))
    let tableView = NSTableView(frame:NSMakeRect(0, 0, 364, 200))
    let column1 = NSTableColumn(identifier: "Col1")
    let column2 = NSTableColumn(identifier: "Col2")
    column1.width = 252
    column2.width = 198
    tableView.addTableColumn(column1)
    tableView.addTableColumn(column2)
    tableView.setDelegate(self)
    tableView.setDataSource(self)
    tableView.reloadData()
    tableContainer.documentView = tableView
    tableContainer.hasVerticalScroller = true
    window.contentView.addSubview(tableContainer)

機能した。

18
Bjorn Tipling

私は自分の質問に答えましたが、これは他の誰かに役立つかもしれないと思いました。headerViewは、テーブルビューをスクロールビューに追加した場合にのみ表示されるようです。

8
Mike2012