[英]How to pass a closure in performSegue's sender parameter?
在我的iOS应用程序中,我想问用户一个问题,然后根据答案采取一些行动。
在许多其他编程框架中,我会使用模态对话框等待用户输入结果,然后将该结果返回给主代码。 但是,据我所知,UIKit 框架不包含这种模态对话框。 相反,我使用模态segue ,但是由于对performSegue
的调用立即返回,因此编程变得有些混乱......
performSegue
有一个Any?
类型的发送者参数Any?
. 当用户退出 segue 时,我可以使用该参数传递一个包含要执行的代码的闭包吗? 而且,如果是这样,如何?
我认为performSegue
不可能做到这一点,但是您可以在执行 segue 时使用prepareForSegue
发送值。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! MyViewController
vc.myParameter = myValue
}
但如果你只是想给用户一个对话并等待答案,还有另一种方法可以做到这一点。
您可以创建一个具有默认背景的 viewController,这将使其隐藏,然后在其中添加一个 View 并根据需要对其进行自定义,您可以将其视为警报。 然后在您想向用户询问数据时启动它。
let vc = self.storyboard?.instantiateViewController(withIdentifier: "alert") as! AlertViewController
vc.definesPresentationContext = true
vc.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
//Here you can pass data into the viewController you're initiating
vc.myParameter = myValue
self.present(vc,animated: false,completion: nil)
这样,您在 viewController 中自定义的 UIView 就会像当前 viewController 上的普通警报一样出现。
在撰写本文时,这个问题有三票反对! 我不明白为什么。 在我看来,我的问题已经清楚地说明了。
可以使用performSegue
和prepare(for:sender:)
。 但是使用instantiateViewController
需要较少的设置工作。
这是基于 Yasser 回答的解决方案:
在故事板中,我创建了一个带有半透明白色背景视图的视图控制器( 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
,也在runPawnPromotionDialog
实现,几乎按照 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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.