3

我刚开始自学可可,我遇到了一个(可能很简单)问题,显示多个基于视图的 NSTableViews 具有相同的委托和控制器(在我的例子中是 App Delegate)。我看到了这篇文章: 处理多个 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;

我在这里做错了什么?

4

2 回答 2

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与实例变量不同的名称,以便我可以成功地将其与以下几行中的实例变量进行比较。

于 2012-09-03T15:08:14.547 回答
1

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

于 2012-09-03T15:06:46.133 回答