NSTableView多列
-
18-09-2019 - |
题
什么是一个简单的方法来设定了我的NSTableView多栏只显示某些数据在一个柱。我有IBOutlets设置,但是我不知道在哪里可以从那里去。
解决方案
假设你不使用可可绑定/核心数据,可以显示数据中NSTableView通过实施两个方法 NSTableViewDataSource 协议。通常你的控制器,将执行《议定书》,因此打开的控制器。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
财产控制器。在接口生成器控制-拖从表中看到控制,并设置 dataSource
.现在,建立和运行,你应该看看你的表中的数据。
如果你只需要填写一栏,添加一个IBOutlet NSTableColumn*对你的控制器;让我们叫它 explosiveColumn
.在接口的建设者,控制拖从控制器柱你要填写和设置 explosiveColumn
.然后,在提供:objectValueForTableColumn:行:你可以测试,如果该 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];
}
在数据源的tableview出口被设置为文件的所有者以及文件的所有者已成立vehicleTableView和racerTableView在IB它们各自的“表视图”。所述colid键检查标识符(通过选择下的“同一性”的表格视图列在IB设定下拉,虽然示出了“身份检查”)。这些值被选择为所述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, “入口”, “名称” 和 “vehicleClass” 将被输入(W / O“)插入标识符字段为各自的列中。
如果您不想显示的类中的一些数据,干脆不输入列标识的关键。提醒一句:我使用的Xcode 4.5.1和我发现,一旦我进入了几个键为特定的列标识符,然后改变了我的主意,并试图清除文本,它抱怨,当我删除从文本标识符字段(我再也不能离开,我已编辑的列字段为空)。这是不难解决,但它是一个惊喜。