Чтобы передать объект UserModel вперед от ShowUserViewController
до ChatViewController
, вы должны использовать что-то под названием Dependency Injection
:
Так что вы будете делать что-то подобное внутри ShowUserViewController
:
@IBAction func chatButtonTapped(_ sender: UIBarButtonItem) {
performSegue(withIdentifier: "UserInfoToChatVC", sender: nil)
}
Примечание. Параметр отправителя должен быть объектом, инициировавшим переход.Это может быть self, то есть объект ShowUserViewController
, но я бы не советовал передавать объект UserModel
, потому что этот объект не инициировал переход и не имеет никакого отношения к навигации.Это должно быть введено внутрь Destination Controller
позже.
В том же файле переопределите метод prepare(for:)
:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "UserInfoToChatVC" {
let chatVC = segue.destination as! ChatViewController
chatVC.currentUser = self.user
}
}
Я полагаю, вы в основном выполнили эту часть правильно,но вам может потребоваться связаться с ChatViewController
до ShowUserViewController
.
. В этом случае вы можете и должны использовать Delegation
.
Создать что-то подобное внутри ShowUserViewController
:
protocol ChatViewControllerDelegate: class {
func didUpdateUser(_ model: UserModel)
}
class ChatViewController: UIViewControler {
var user: UserModel?
weak var delegate: ChatViewControllerDelegate?
/* more code */
func someEventHappened() {
delegate?.didUpdateUser(self.user!)
}
}
Наконец, к методу prepare(for:)
необходимо добавить дополнительную строку:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "UserInfoToChatVC" {
let chatVC = segue.destination as! ChatViewController
chatVC.currentUser = self.user
// Add this line...
chatVC.delegate = self
}
}
И указать, что ShowUserViewController
реализует протокол ChatViewControllerDelegate
, затемпереопределить метод didUpdateUser(_:)
:
func didUpdateUser(_ model: UserModel) {
// Some code here
}