我想用一些自定义方法扩展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
的类?
答案 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)
可以为此协议添加方法。但实现将驻留在扩展中,没有明显的方法在符合协议的类中实现其他方法。