2017-01-09 47 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')。 –

相關問題