2017-01-09 45 views
0

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

我试图编写和扩展到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的类?

+0

'但在这个扩展中,我没有访问委托类' - 你能解释这一点吗?你究竟想如何访问它?如果你添加你的代码会更好。 – user28434

+0

感谢您关注这个问题。添加了一个代码片段。 –

+0

'NSTableViewDelegate'不知道'isTableViewFirstResponder'。我想你想扩展NSTableView而不是委托。 – shallowThought

回答

1

可以在此协议中添加方法。但是实现将处于扩展状态,没有明显的方法来实现符合协议的类中的其他方法。

1

您正在扩展NSTableViewDelegate协议,因此只能看到存在于NSTableViewDelegate的实现中的内容。 isTableViewFirstResponderNSTableViewDelegate的实现中不存在,因此不为扩展所知。

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

protocol NSTableViewResponder { 
    var isTableViewFirstResponder: Bool {get set} 
} 

extension NSTableViewResponder { 
    mutating func didBecomeFirstResponder(_ tableView: NSTableView) { 
     isTableViewFirstResponder = true 
    } 

    mutating func didResignFirstResponder(_ tableView: NSTableView) { 
     isTableViewFirstResponder = false 
    } 
} 
+0

'isTableViewFirstResponder'是委托类的一个属性。我的表视图子类通过问题中描述的2种方法通知其代表关于获得/放弃第一响应者状态,并且委托必须将状态存储在其属性“isTableViewFirstResponder”布尔值中。我只是想在委托类中实现这两种方法,就像所有常见的'NSTableViewDelegate'方法一样。 –

+1

我找不到'isTableViewFirstResponder' [在NSTableView文档](https://developer.apple.com/reference/appkit/nstableviewdelegate)。 – shallowThought

+0

当然,因为它是委托的自定义属性(比如'MyViewController')。 –

相关问题