繁体   English   中英

如何在 performSegue 的 sender 参数中传递闭包?

[英]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 上的普通警报一样出现。

在撰写本文时,这个问题有三票反对! 我不明白为什么。 在我看来,我的问题已经清楚地说明了。

可以使用performSegueprepare(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM