具有多列的NSTableView

3

如何简单地设置具有多个列的NSTableView,以仅在一列中显示特定数据。我已经设置了IBOutlets,但不知道该从哪里开始。

2个回答

7
假设您没有使用Cocoa绑定/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中,从控制器向要填充的列进行控制拖动并设置explosiveColumn。然后,在tableView:objectValueForTableColumn:row:中,您可以测试column参数是否与outlet设置的对象相同:
– (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


我该如何测试它?我有多列,但我只想在其中一列中显示数据。 - Matt S.
我已经更新了答案,并提供了更具体的细节。基本上,您需要检查列参数以查看它是否是您感兴趣的参数,否则返回nil - Dominic Cooney

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];
}

表视图数据源插座设置为文件所有者,文件所有者已将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,“entry”,“name”和“vehicleClass”将被输入(不带引号)到它们各自列的标识符字段中。

如果您不想在类中显示某些数据,只需不输入列标识符的键即可。请注意:我正在使用Xcode 4.5.1,我注意到一旦我为特定列标识符输入了几个键,然后改变主意并尝试清除文本时,当我从标识符字段中删除文本时,它会发出警告(我不能再留空我编辑过的列)。这不难解决,但确实让人感到意外。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接