Есть несколько способов сделать это, но обычно это зависит от того, как вы переходите с VC # 1 на VC # 2 и обратно.
(1) Код, который вы опубликовали, подразумевает, что у вас есть раскадровкаоба вида контроллеров.В этом случае создайте переход от VC # 1 к VC # 2 и выполните «раскрутку» обратно.Оба довольно легко сделать.Ссылка , предоставленная в комментариях, хорошо показывает вас, но, в зависимости от (1) того, сколько данных вы хотите передать обратно в VC # 1 и (2), если вы хотите выполнить функциюна VC # 2 вы также можете сделать это:
VC # 1:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowVC2" {
if let vc = segue.destination as? VC2ViewController {
vc.VC1 = self
}
}
}
VC # 2:
weak var VC1:VC1ViewController!
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if isMovingFromParentViewController {
VC1.executeSomeFunction()
}
}
В основном вы передаете весь экземпляр VC1 и, следовательно, имеет доступ ко всему, что не отмечено private
.
(2) Если вы представляете / исключаете VC # 2 из VC # 1, используйте delegate
стиль, описанный в одном из ответов.
VC # 1:
var VC2 = VC2ViewController()
extension VC1ViewController: VC2ControlllerDelegate {
func showVC2() {
VC2.delegate = self
VC2.someData = someData
present(VC2, animated: true, completion: nil)
}
function somethingChanged(sender: VC2ViewController) {
// you'll find your data in sender.someData, do what you need
}
}
VC # 2:
protocol VC2Delegate {
func somethingChanged(sender: VC2ViewController) {
delegate.somethingChanged(sender: self)
}
}
class DefineViewController: UIViewController {
var delegate:DefineVCDelegate! = nil
var someData:Any!
func dismissMe() {
delegate.somethingChanged(sender: self)
dismiss(animated: true, completion: nil)
}
}
}
В основномвы делаете VC # 1 делегатом VC2.Я предпочитаю синтаксис объявления в VC # 2 для `делегата, потому что, если вы забудете установить VC # 1 в качестве делегата для VC # 2, во время выполнения вы вызовете ошибку.