1つの列に特定のデータのみを表示するように複数の列でNSTableViewを設定する簡単な方法は何ですか。IBOutletsを設定しましたが、そこからどこに行けばいいのかわかりません。
2 に答える
Cocoa Bindings / Core Dataを使用していない場合、NSTableViewDataSourceプロトコルから2つのメソッドを実装することにより、NSTableViewにデータを表示できます。通常、コントローラーはプロトコルを実装するため、コントローラーの.mファイルを開き、これらのメソッドをコントローラーに追加します@implementation
。
- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
return 25; // fill this out
}
– (id) tableView:(NSTableView*)tableView
objectValueForTableColumn:(NSTableColumn*)column
row:(int)row {
return row % 3 ? @"Tick..." : @"BOOM!"; // fill this out
}
dataSource
テーブルのプロパティをコントローラーに設定する必要があります。Interface Builderのcontrolキーを押しながら、テーブルビューからコントローラーにドラッグして設定しdataSource
ます。次にビルドして実行すると、テーブルにデータが表示されます。
1つの列のみに入力する場合は、コントローラーにIBOutletNSTableColumn*を追加します。それを呼びましょうexplosiveColumn
。Interface Builderで、controlキーを押しながら、コントローラーから入力して設定する列にドラッグしますexplosiveColumn
。次に、tableView:objectValueForTableColumn:row:で、column
パラメーターがアウトレットが設定されているオブジェクトと同じオブジェクトであるかどうかをテストできます。
– (id) tableView:(NSTableView*)tableView
objectValueForTableColumn:(NSTableColumn*)column
row:(int)row {
if (column == explosiveColumn) {
return row % 3 ? @"Tick..." : @"BOOM!";
} else {
// other columns blank for now
return nil;
}
}
このチュートリアルは役立つかもしれません:http://www.cocoadev.com/index.pl?NSTableViewTutorial
データソースメソッドとドキュメントベースのアプリケーションで複数のテーブルビューを使用する例を次に示します。
#pragma mark - Data Source Methods
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv
{
if (tv == racerTableView)
return [racerList count];
else if (tv == vehicleTableView)
return [vehicleList count];
else
return 0; // something wrong here...
}
- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col
row:(NSInteger)rowi
{
NSString *colid = [col identifier];
if (tv == racerTableView){
NHRacers *racer = [racerList objectAtIndex:rowi];
return [racer valueForKey:colid];
}
else if (tv == vehicleTableView){
NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
return [vehicle valueForKey:colid];
}
else
return 0; // something wrong here...
}
- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi
{
NSString *colid = [col identifier];
if (tv == racerTableView) {
NHRacers *racer = [racerList objectAtIndex:rowi];
[racer setValue:obj forKey:colid];
}
else if (tv == vehicleTableView){
NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
[vehicle setValue:obj forKey:colid];
}
else
nil; // something wrong here...
[self updateChangeCount:NSChangeDone];
}
テーブルビューデータソースアウトレットはファイルの所有者に設定され、ファイルの所有者はビークルテーブルビューとレーサーテーブルビューをIBのそれぞれの「テーブルビュー」に設定しました。colidキーは識別子をチェックします(「Identity」ドロップダウンの下のテーブルビュー列を選択することでIBに設定され、「IdentityInspector」が表示されます)。これらの値は、テーブルビューに表示されるクラスのKVC(キーコーディング準拠)プロパティとして選択されました。小文字の最初の文字を使用してください(残りについては、アップルのドキュメントを参照してください)。
例:(NHVehicles.h内)
@interface NHVehicles : NSObject
{
NSUInteger entry;
NSString *name;
NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end
(NHVehicles.mで)
@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end
このtableViewの場合、「entry」、「name」、および「vehicleClass」は、それぞれの列の識別子フィールドに入力されます(「なし」)。
クラスに一部のデータを表示したくない場合は、列識別子のキーを入力しないでください。注意:Xcode 4.5.1を使用していますが、特定の列識別子にいくつかのキーを入力し、気が変わってテキストをクリアしようとすると、テキストを削除すると文句が表示されることに気付きました。識別子フィールド(編集した列のフィールドを空白のままにすることはできなくなりました)。これを回避するのは難しくありませんでしたが、驚きでした。