如何向NSTableViewDelegate协议添加方法?

时间:2017-01-09 11:15:12

标签: swift cocoa delegates nstableview swift-protocols

我想用一些自定义方法扩展NSTableViewDelegate协议。例如,我希望我的自定义NSTableView子类通知代理某些特定事件。是否有可能不创建另一个协议,而是向现有协议添加自定义方法?这里最好的方法是什么?

我尝试编写和扩展到NSTableViewDelegate,并调用方法,但在此扩展中,我无法访问委托类(我的NSViewController的子类)。它会破坏整个想法,因为控制器需要以特定的方式响应事件。

那么:如何向NSTableViewDelegate协议添加方法并在委托类中提供实现?

对于详细程度表示抱歉:)

示例代码(在项目中它有点不同,但想法是一样的):

extension NSTableViewDelegate {
    func didBecomeFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = true //warning: Use of unresolved identifier 'isTableViewFirstResponder'
    }

    func didResignFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = false   //warning: Use of unresolved identifier 'isTableViewFirstResponder'
    }
}

isTableViewFirstResponder是委托类的属性。 斯威夫特只是不知道在哪里寻找它。如何指定声明isTableViewFirstResponder的类?

2 个答案:

答案 0 :(得分:1)

您正在扩展NSTableViewDelegate协议,因此只能看到isTableViewFirstResponder实施中存在的内容。 NSTableViewDelegate实现中不存在protocol NSTableViewResponder { var isTableViewFirstResponder: Bool {get set} } extension NSTableViewResponder { mutating func didBecomeFirstResponder(_ tableView: NSTableView) { isTableViewFirstResponder = true } mutating func didResignFirstResponder(_ tableView: NSTableView) { isTableViewFirstResponder = false } } ,因此扩展名不知道。

Afaik不可能将存储的属性添加到扩展名,因此我认为你必须引入一个额外的Protcol,这也是有意义的。因为它不是代表的责任,而是一个响应者:

oldWeek;
oldStyles;
setWeekClasses(week: Week): Object {
    if(this.oldWeek != week) {
      let state: string = this.state(week.state);
      this.oldStyles = {
        'currentWeek': week.weekNumber === this.selectedDate.getWeekNumber(),
        [week.state]: true,
      };
      this.oldWeek = week;
    }

    return this.oldStyles;
}

答案 1 :(得分:1)

可以为此协议添加方法。但实现将驻留在扩展中,没有明显的方法在符合协议的类中实现其他方法。