nextView
считается суперклассом UIViewController
, поскольку массив viewControllers
из UINavigationController
определен так ([UIViewController]
).
Если ваш VC1 имеет тип FirstVC
(подкласс UIViewController
), вы должны привести его к фактическому классу, чтобы иметь возможность "видеть" ваши дополнительные свойства. То же самое с вашими следующими контроллерами представления. Итак, что произойдет, если вы сделаете это?
let nextView = nav?.viewControllers[(nav?.viewControllers.count)! - 1] as? SecondVC
Конечно, предполагая, что ваш nextView
имеет класс SecondVC
. Помните, что объектно-ориентированное программирование имеет полиморфизм , в котором все ваши контроллеры представления являются потомками UIViewController
и, таким образом, они являются a UIViewController
в целом, и такие ситуации могут возникнуть.
В любом случае, правильным способом было бы определить протокол, заставить FirstVC
соответствовать ему, передать первый контроллер вида в качестве параметра в SecondVC
и, во втором контроллере представления, вызвать метод протокола обратно к первый вид контроллера при выборе опции. Что-то вроде:
protocol PassDataBackProtocol {
var result: String
}
class FirstVC: UIViewController, PassDataBackProtocol {
var result: String = "" {
didSet {
// Update your view
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondVC = segue.destination as? SecondVC {
secondVC.firstVC = self
}
}
}
class SecondVC: UIViewController {
weak var firstVC: PassDataBackProtocol?
func didChangeValue(newValue: String) {
firstVC?.result = newValue
navigationController?.popViewController(animated: true)
}
}
Если вы используете pushViewController(_:animated:)
вместо segues, тогда установите firstVC
перед выполнением push.
EDIT: Я добавил свойство weak
к обратному указателю, поскольку важно избегать сохранения циклов.