На момент написания этого вопроса было три отрицательных голоса!Я не понимаю почему.На мой взгляд, мой вопрос четко сформулирован.
Можно использовать performSegue
и prepare(for:sender:)
.Но использование instantiateViewController
требует меньше работы по настройке.
Вот решение , основанное на ответе Ясира :
В раскадровке я создал контроллер представления (PawnPromotionVC
) с полупрозрачным белым фоновым представлением и непрозрачным меньшим вложенным представлением, содержащим «диалог».Контроллер представления имеет атрибут onExit
, объявленный следующим образом:
var onExit : ((Piece) -> Void)?
Ниже представлен обработчик действий для нажатий кнопок в этом контроллере представления (кстати, цель «диалога» состоит в том, чтобы спроситьпользователь, какую шахматную фигуру следует продвигать пешке):
@IBAction func pieceButtonTapped(_ sender: UIButton) {
let piece = Piece(rawValue: sender.tag)!
if let run = onExit {
run( piece )
}
dismiss(animated: true, completion: nil)
}
Чтобы открыть диалоговое окно, я вызываю
if ... {
runPawnPromotionDialog(){
(piece:Piece) in
print("the pawn should be promoted to a \(piece)" )
...
...
}
}
из моего mainViewController .Функция runPawnPromotionDialog
, также реализованная в mainViewController, практически реализована в соответствии с предложением Yasser:
func runPawnPromotionDialog( onExit: @escaping (Piece) -> Void ){
let vc = self.storyboard?.instantiateViewController(withIdentifier: "PawnPromotionVC") as! PawnPromotionVC
vc.definesPresentationContext = true
vc.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
vc.modalTransitionStyle = .crossDissolve
vc.onExit = onExit
self.present(vc,animated: false,completion: nil)
}