Да, это верное решение наверняка. Ваши пользовательские ячейки слепы и ничего не знают о вашем контроллере. Они только запускают методы делегата.
Но есть еще одно правильное решение, и это наблюдение. Кто-то предпочитает делегирование, кто-то предпочитает наблюдение. Вы можете использовать NotificationCenter
, чтобы публиковать свои уведомления о касаниях, происходящих в ваших ячейках, и делать свой контроллер наблюдателем, который реагирует на эти уведомления.
// inside your cell
NotificationCenter.default.post(name: Notification.Name("ButtonPressed"), object: nil)
// inside your controller
NotificationCenter.default.addObserver(self, selector: #selector(someHandler), name: Notification.Name("ButtonPressed"), object: nil)
И ваш func someHandler()
будет обрабатывать вызов, когда ваш контроллер (наблюдатель) отлавливает опубликованные события.
Кроме того, есть KVO , но это грязно и не подходит для этого конкретного случая, так как у вас есть несколько ячеек.
Еще одним способом настройки канала связи является привязка . Он может быть как ручным, так и реактивным (например, с использованием ReactiveSwift).
Например, одно руководство:
// in your controller
cell.pressHandler = {
// do something
...
}
// in your cell
var pressHandler: (() -> Void)?
...
// when the button is pressed you execute that handler
pressHandler?()