2017-01-09 6 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 является свойством класса делегата. Swift просто не знает, где его искать. Как указать класс, в котором объявлен isTableViewFirstResponder?

+0

'но в этом расширении у меня нет доступа к классу делегата' - можете ли вы это объяснить? Как именно вы хотите получить к нему доступ? Было бы лучше, если бы вы добавили свой код. – user28434

+0

Благодарим вас за внимание. Добавлен фрагмент кода. –

+0

'NSTableViewDelegate' не знает о' isTableViewFirstResponder'. Я думаю, вы хотите расширить NSTableView, а не делегат. – shallowThought

ответ

1

К этому протоколу можно добавить метод. Но реализация будет распространяться в расширении, нет очевидного способа реализации дополнительных методов в классе, который соответствует протоколу.

1

Вы расширяете протокол NSTableViewDelegate и таким образом можете видеть только то, что существует в реализации NSTableViewDelegate. isTableViewFirstResponder не существует в версии NSTableViewDelegate s и, следовательно, не известен расширению.

Afaik невозможно добавить сохраненное свойство к расширению, поэтому, я думаю, вам нужно представить дополнительный Protcol, который также имеет смысл imo. так как это не является ответственностью делегата, а ответчиком один:

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' является свойством класса делегата. Подкласс my table view информирует своего делегата о получении/увольнении статуса первого ответчика с помощью двух методов, описанных в вопросе, и делегат должен сохранить статус в своем свойстве 'isTableViewFirstResponder' boolean. Я просто хочу реализовать эти 2 метода в классе делегатов, как и все обычные методы «NSTableViewDelegate». –

+1

Я не могу найти 'isTableViewFirstResponder' [в документации NSTableView] (https://developer.apple.com/reference/appkit/nstableviewdelegate). – shallowThought

+0

, конечно, потому что это настраиваемое свойство делегата (скажем, 'MyViewController'). –