Вы не должны использовать этот подход для достижения результата, вы можете использовать два разных подхода для достижения одного и того же результата.
1- Используйте подход протокола делегата: в secondViewController вы должныобъявите протокол как этот
protocol applySelecction {
func applyText(text: String)
}
и в классе объявите переменную как этот.
var delegate: apply selection?
затем в действии кнопки
@IBAction func saveButtom(sender: UIButton){
//print(selected)
delegate?.applySelection(text: text) //text is the value select from UILAbel o the option the user select
self.dismiss(animated: true, completion: nil)
}
затем в firstViewController соответствует протоколу applySelection следующим образом:
class FirstViewController: UIViewController,applySelection{
func applyText(text: String){
//update the UIlabel here
2 - использовать замыкание.здесь в secondViewController вы должны добавить новую переменную, подобную этой,
var applyText: ((String) -> Void)?
, затем в
@IBAction func saveButtom(sender: UIButton){
self.applyText(text) //text is your text to update
}
и в firstViewController для подготовки кsegue rewrite следующим образом.
let vc = segue.destination as! fisrtViewController)
vc.applyText = { [weak self] data in
guard let self = self else {return}
self.text = text //this is assigning the text to self-text supposing text is a UILabel in this viewController
}
Вы можете попробовать один из двух подходов, которые могут показаться вам подходящими.
РЕДАКТИРОВАТЬ .
попробуйте это.
class ViewController2: UIViewController {
var selectionDelegate:gameModeDelegate!
@IBAction func chooseButton(_ sender: Any) {
selectionDelegate.didTapChoice(test: "TEST")
//if segue is a show segue
self.navigationController?.popViewController(animated: true)
//else is a modal segue.
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
PD.Вам не нужно представлять viewcontroller, уже присутствующий в стеке представлений, только отклонить его.Удачи