基于视图的NSTableView + NSButton

时间:2014-03-26 05:22:41

标签: macos cocoa nstableview cocoa-bindings

我有一个基于视图的NSTableView,使用Cocoa Bindings来更改单元格中某些标签和图像的值。这一切都很棒。但是,我想在单元格中添加一个按钮。我有按钮工作,但它的动作方法只有按钮作为发送者,这意味着我不知道按钮所在的单元格的内容。不知何故,我需要在按钮上存储一些额外的数据 - 在至少是按钮所在的行索引。我将NSButton子类化并在单元格中使用了我的子类,但是Interface Builder不知道额外的属性,因此我无法绑定它。如果我想在代码中绑定它,我不知道将传递给它的对象或keypath的名称。

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:6)

您可以在action方法中使用rowForView来获取行值

- (IBAction)doSomething:(id)sender
{
        NSInteger row = [_myTableView rowForView:sender];
}

答案 1 :(得分:0)

您可以使用Interface Builder中的 Identity 字段将来自nib的表格单元格视图与代码中的实例相关联:

enter image description here

此外,您必须在表视图的委托中实现- tableView:viewForTableColumn:row:。 (不要忘记在IB中连接代表)

 - (NSView*)tableView:(NSTableView*)tableView viewForTableColumn:  
(NSTableColumn*)tableColumn row:(NSInteger)row
    {
        SSWButtonTableCellView *result = [tableView makeViewWithIdentifier:@"ButtonView" owner:self];
        result.button.title = [self.names objectAtIndex:row][@"name"];
        result.representedObject = [self.names objectAtIndex:row];
        return result;
    }

我在representedObject子类中添加了NSTableCellView属性,我在上面的表视图委托方法中设置了该属性。

您的自定义表格单元格视图稍后可以在其操作中使用该对象。 e.g:

- (IBAction)doSomething:(id)sender
{
    NSLog(@"Represented Object:%@", self.representedObject);
}