Вы можете использовать замыкания для отправки сообщений вашему контроллеру табличного представления.
Объявите переменную замыкания в объекте источника данных.
class ProfileViewModel: NSObject {
var textViewDidChange: (() -> Void)?
// If you need to send some data to your controller, declare it with type. In your case it's string.
// var textViewDidChange: ((String) -> Void)?
}
Отправьте ваше сообщение от вашего делегата текстового поля наваша вновь созданная переменная, подобная этой.
func textViewDidChange(_ textView: UITextView) {
self.textViewDidChange?()
// If you need to send your string, do it like this
// self.textViewDidChange?(textView.text)
}
Как вы можете догадаться, ваша переменная textViewDidChange
по-прежнему nil
, поэтому никакое сообщение не пройдет.Поэтому мы должны объявить это сейчас.
В вашем контроллере представления, где у вас есть доступ к источнику данных, установите значение вашего закрытия.
class MyProfileController: UITableViewController {
fileprivate var viewModel: ProfileViewModel?
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UserInfoCell.self, forCellReuseIdentifier: UserInfoCell.identifier)
viewModel = ProfileViewModel()
tableView.dataSource = self.viewModel
// Set the closure value here
viewmodel.textViewDidChange = { [unowned self](/* if you are sending data, capture it here, if not leave empty */) in
// Do whatever you like with your table view here.
// [unowned self] could sound tricky. It's whole another subject which isn't in the scope of this question. But of course there are some great answers here about it. Simply put, if you don't use it, you'll create a memory leak.
}
}
}