将我的 NSTableView 设置为具有多列以仅在一列中显示某些数据的简单方法是什么。我设置了 IBOutlets,但我不知道从那里去哪里。
2 回答
假设您没有使用 Cocoa Bindings/Core Data,您可以通过实现NSTableViewDataSource协议中的两种方法在 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 中,从表格视图中控制并拖动到控制器并设置dataSource
. 现在构建并运行,您应该会在表格中看到您的数据。
如果您只想填写一列,请将 IBOutlet NSTableColumn* 添加到您的控制器;让我们称之为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 中设置,同时显示“Identity Inspector”)。这些值被选为表视图中显示的类的 KVC(符合键编码)属性:使用小写首字母(请参阅 Apple 文档以了解其他信息)。
例如:(在 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”将被输入(w/o“)到它们各自列的标识符字段中。
如果您不想在类中显示某些数据,只需不要输入列标识符的键。提醒一句:我使用的是 Xcode 4.5.1,我注意到一旦我为特定列标识符输入了几个键,然后改变主意并尝试清除文本,当我从标识符字段(我不能再将已编辑的列的字段留空)。这并不难解决,但它是一个惊喜。