5

我在 10.8 上运行基于视图的 NSTableView 时遇到问题(目标是 10.7,但我认为这不相关)。

我正在使用 NSTableView,并通过绑定获取自定义 NSTableCellView 的内容值。我使用 NSTableCellView 的 obejctValue 来获取我的数据。

我在我的单元格中添加了一个按钮,我希望它在单击时触发一些操作。到目前为止,我只能在自定义 NSTableCellView 的子类中触发一个动作。

我可以使用链获取像这样单击的行:

NSButton *myButton = (NSButton*)sender;    

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview;

NSInteger rowClicked = [myView rowForView:myButton.superview];

从那里我不知道如何到达定义操作的应用程序代表或控制器。

当我使用可可绑定时,我在 NSTableView 上没有可以用来触发我的操作的委托。

你知道我怎么能和控制器说话吗?

提前谢谢了!

4

4 回答 4

3

感谢您的问题,我还将从 NSTableView 上的按钮触发操作。你的问题帮助我走上了正确的道路。

首先解决您的解决方案,以查找我的 NSTableView 所在的行号。我能够在不知道按钮的情况下找到它,在我的自定义 NSTableView 中,我第一次尝试安装了以下内容:

- (NSInteger)myRowNumber  
{  
    return [(NSTableView*)self.superview.superview rowForView:self];  
}

这工作正常,但它不够健壮。只有当您已经明确知道您在视图层次结构中的深度时,它才有效。一个更强大和通用的解决方案是:

- (NSInteger)myRowNumber  
{   
    NSTableView* tableView = nil;   
    NSView* mySuperview = self;   

    do   
    {   
        NSView* nextSuper = mySuperview.superview;   
        if (nextSuper == nil)   
        {   
            NSException *exception =   
                [NSException exceptionWithName:@"NSTableView not found."   
                    reason:[NSString stringWithFormat:@"%@ search went too deep.",   
                    NSStringFromSelector(_cmd)] userInfo:nil];   
            @throw exception;   
        }   

        if ([nextSuper isKindOfClass:[NSTableView class]])   
            tableView = (NSTableView*)nextSuper;   
        else   
            mySuperview = mySuperview.superview;   
    } while (tableView == nil);   

    return [tableView rowForView:self];   
}   

这不仅适用于 NSTableView 级别,而且适用于任何安装在其上的任何级别,无论视图层次结构多么复杂。

至于您的问题中未回答的部分,我在我的班级中建立了一个 IBOutlet 并使用与我的文件所有者(在我的情况下是我的文档类)绑定的界面构建器。一旦我引用了我发送消息的类和行号,我就会调用该函数。在我的情况下,调用要求我传递它源自的行号。

[self.myDoc doSomethingToRow:self.myRowNumber];   

我对此进行了测试,它可以在 NSTableView 之上的视图层次结构的各个级别上工作。它的功能不必首先选择行(这似乎是在 Apples 文档中假设的)。

问候,乔治·劳伦斯·斯托姆,美国华盛顿州马尔特比

于 2013-01-10T12:53:49.487 回答
3

尽管您使用的是绑定,但您仍然可以在界面构建器中将控制器设置为您的 tableview 的委托。

我看到您已经能够从单元格内部访问表格视图。下一个任务必须很简单,只需将表视图委托设置为按钮操作的目标。

于 2012-09-05T03:36:13.713 回答
2

使用rowForView:和响应者链

要响应嵌入在 中的控件的操作NSTableCellView,该控件应将该操作发布给First Responder。或者,文件所有者是可能的,但这是更紧密的耦合。

在 action 方法中使用rowForView:来确定哪一行的控件发出了该操作:

- (IBAction)revealInFinder:(id)sender {
    NSInteger row = [self.tableView rowForView:sender];
    ...
}

该操作在任何响应者链类中实现。这很可能是您的子类NSWindowController实例。响应者也可以是应用程序委托;假设代表有办法与NSTableView.

请参阅 Apple 的示例TableViewPlayground:使用基于视图的 NSTableView 和 NSOutlineView来了解这一点。

于 2017-11-30T11:18:09.120 回答
0

苏哈斯的回答帮助了我。

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "EDIT_CELL_VIEW"), owner: self) as? SymbolManagerCell  {                    
                if let editButton = cell.subviews[0] as? NSButton {
                    editButton.target = cell // this is required to trigger action
                }
                return cell
            }
    return nil
}
于 2019-03-04T18:12:06.270 回答