Cocoa - 基于多视图的NSTableViews

时间:2012-09-03 14:45:13

标签: objective-c cocoa nstableview

我刚刚开始自学cocoa,我遇到了一个(可能是简单的)问题,显示了多个基于视图的NSTableViews,它们具有相同的委托和控制器(在我的例子中是App Delegate)。我看到这篇文章: Best way to handle multiple NSTableView(s) 但是描述的方法仍然给我错误 - 特别是

方法'numberOfRowsInTableView:'的重复声明 方法'tableView:viewForTableColumn:row:'

的重复声明

显然,编译器没有看到不同的方法声明适用于不同的表视图。

AppDelegate.m文件中的tableviews代码是

@synthesize tableView1;
@synthesize tableView2;

-(NSUInteger)numberOfRowsInTableView:(NSTableView *)tableView1
{
    return 1;
}

-(NSUInteger)numberOfRowsInTableView:(NSTableView *)tableView2
{
    return 2;
}

- (NSView *)tableView:(NSTableView *)tableView1 viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView *resultForTable1 = [tableView1 makeViewWithIdentifier:tableColumn.identifier owner:self];
    resultForTable1.textField.stringValue = @"This should appear in the first tableView";
    return resultForTable1;
}

- (NSView *)tableView:(NSTableView *)tableView2 viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSTableCellView *resultForTable2 = [tableView2 makeViewWithIdentifier:tableColumn.identifier owner:self];
    resultForTable2.textField.stringValue = @"This should appear in the second tableView";
    return resultForTable2;
}

在我的AppDelegate.h文件中,我有:

@property (weak) IBOutlet NSTableView *tableView1;
@property (weak) IBOutlet NSTableView *tableView2;

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

我认为你误解了答案中描述的方法。

您遇到编译器错误,因为您尝试两次实现相同的方法。以下都是相同方法的实现:

- (void)setBlah:(id)aBlah {
- (void)setBlah:(id)newBlah {
- (void)setBlah:(id)theNewBlah {

(id)参数类型后面的参数赋予的不同“名称”仅对该方法的实现块是本地的。

您应该能够使用以下代码完成您想要的操作:

@synthesize tableView1;
@synthesize tableView2;

- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
    if (aTableView == tableView1) return 1;
    else if (aTableView == tableView2) return 2;
    return 0;
}

- (NSView *)tableView:(NSTableView *)aTableView
     viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    NSTableCellView *tableCellView = [aTableView
                   makeViewWithIdentifier:tableColumn.identifier owner:self];
    if (aTableView == tableView1) {
        tableCellView.textField.stringValue = 
                 @"This should appear in the first tableView";
    } else if (aTableView == tableView2) {
        tableCellView.textField.stringValue = 
                 @"This should appear in the second tableView";
    }
    return tableCellView;
}

请注意,我确保将参数aTableView命名为与实例变量不同的参数,以便我可以将其成功地与以下行中的实例变量进行比较。

答案 1 :(得分:1)

你不会多次复制这些方法 - 你没有提供参数,“tableView1”,tableView2“等,表视图调用这些方法并将自己作为参数发送。所以,如果你想要的话为多个表使用相同的委托,你将if语句放在委托方法中,以确定哪个表发送了消息。为每个表声明一个IBOutlet,然后(如果是伪代码)如果table1 .... else if table2。 ..等