具有多列的NSTableView

时间:2010-02-05 01:49:46

标签: cocoa nstableview nstablecolumn

使用多列设置NSTableView以仅在一列中显示某些数据的简单方法是什么。我设置了IBOutlets,但我不知道从那里去哪里。

2 个答案:

答案 0 :(得分:7)

假设您没有使用Cocoa绑定/核心数据,您可以通过实现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中,控制 - 从控制器拖动到要填充的列并设置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

答案 1 :(得分:0)

以下是使用带有数据源方法和基于文档的应用程序的多个表视图的示例:

#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键检查标识符(通过选择“Identity”下拉列表下的表视图列来设置IB,同时显示“Identity Inspector”)。这些值被选择为表视图中显示的类的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”将在其各自列的标识符字段中键入(w / o“)。

如果您不想在课程中显示某些数据,只需输入列标识符的密钥即可。提醒一句:我正在使用Xcode 4.5.1,我注意到,一旦我为特定的列标识符输入了几个键,然后改变了主意并试图清除文本,它就会在我从中删除文本时抱怨标识符字段(我不能再为我编辑的列留空字段)。这并不难解决,但这是一个惊喜。