8

NSTableview とボタンがあります。NSTableview の列数が不明です。

最初の列にはイメージ ウェルと 2 つのテキスト ボックスがあり、その他 (これも不明な番号) は通常のテキスト ボックス列です。

ボタンをクリックすると、ファイルを開くダイアログが開きます。ファイル (.jpg) を選択したら、それらを処理したいと思います。

これまでのところ、すべてが作成されています (ファイル、列などを選択)。欠けているのは、テーブルの作成です。

選択したすべてのファイルを通過するループがあります。これを行う最善の方法は何ですか:

  • 最初のセルの画像ウェルに画像を表示し、
  • 最初のセルの最初のテキストボックスにファイル名を入力し、
  • テキストボックスの 2 番目のセルにファイルパスを入力し、
  • 他のすべての列に「YES」と入力します。

私の難しさは、ユーザーに依存するため、そこにいくつの列があるかわからないことです。列の数はランタイム中に変更されません。これらは、構成に基づいて起動時にセットアップされます。構成が変更された場合は、アプリをリロードする必要があります。

私は Objective-C/Cocoa プログラミングの初心者です。

編集: 要求された追加情報:

これはビューベースの NSTableView であり、各列は画像に対して後で実行する必要があるアクションを表します。プログラムのユーザーは、実行するアクションの種類と数を決定できます。これが、テーブル ビューの列数が不明な理由です。

4

2 に答える 2

13

を使用してプログラムで列を追加できますaddTableColumn:。このメソッドは、NSTableColumnコードで作成できるインスタンスを取ります。

アーキテクチャの残りの部分 (画像の表示など) は、列が動的に追加されたという理由だけで、「通常の」コードから特に変更されることはありません。

以下は、開始するためのスニペットです。

NSTableColumn* tc          = [[NSTableColumn alloc] init];

NSString *columnIdentifier = @"NewCol"; // Make a distinct one for each column
NSString *columnHeader     = @"New Column"; // Or whatever you want to show the user

[[tc headerCell ] setStringValue: columnHeader];
tc.identifier = columnIdentifier;

// You may need this one, too, to get it to show.
self.dataTableview.headerView.needsDisplay = YES;

テーブルにデータを入力するとき、モデルが ( のself.model)NSDictionaryオブジェクトの配列であると仮定すると、次のようになります。

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

     NSString *columnIdentifier = tableColumn.identifier;

     NSDictionary *rowDict = [self.model objectAtIndex: row];

     NSString *value = [rowDict valueForKey: columnIdentifier]; // Presuming the value is stored as a string 

     // Show the value in the view
}

詳しくはドキュメントをご覧ください。

于 2013-02-02T16:30:52.097 に答える
3

ユーザーが列または行を追加するときは、(バインディングまたはコードによって) モデルに反映する必要があります。これにより、テーブルにデータを入力する必要があるときに、テーブルのサイズがわかります。

tableView.delegate を設定します (コードまたは Interface Builder で)。こちらを参照してください

埋め込む:

- (NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)row
{ 
    Item* itemView = [tableView makeViewWithIdentifier:@"rowItem" owner:self];

    /*Here you populate your cell view*/
    id entryObject = [self.entries objectAtIndex:row];
    [itemView setEntry:entryObject];

    return itemView;
}

そして呼び出す[tableView reloadData];

この方法を使ったほうがいいかもしれません

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

NSTableViewDataSourceNSTableViewDelegateを見てください

于 2013-02-03T02:31:47.233 に答える