【问题标题】:How to perform an action after performSegue is finished in Swift如何在 Swift 中完成 performSegue 后执行操作
【发布时间】:2020-01-28 10:26:39
【问题描述】:

有没有什么方法可以在一个 segue 快速完成后执行一个动作?

我正在调用此代码:

self.performSegue(withIdentifier: "showDamageReportSegue", sender: self)

segue 打开一个新的 ViewController 模式,在用户按下完成按钮后,我希望它继续运行下面的代码

self.performReservationEndingSequence() // which does some calls etc

我是否缺少performSeguecompletion handler?我一直在搜索,但找不到这个具体问题。

【问题讨论】:

  • 您的意思是在关闭视图控制器时执行某些操作?
  • 你不能在下一个视图控制器的viewDidLoad 中做到这一点吗?或viewWillDisappear
  • 可以在viewwilldisappear调用中写代码
  • 这个segue被多次调用,但只有在这个实例上它应该执行self.performReservationEndingSequence()所以viewWillDissapear不是一个选项。
  • @FinleySiebert 有一个 prepareForSegue 方法在 performSegue 之前调用,你可以在那里调用你的函数。并检查是否 segue.identifier == "yourIdentifier" ,然后只调用该函数,否则不

标签: ios swift xcode


【解决方案1】:

一个合理的解决方案是回调闭包。

  • showDamageReportSegue 控制器中添加回调属性

    var callback : (() -> Void)?
    
  • showDamageReportSegue 控制器中调用 callback in viewDidDisappear

    override func viewDidDisappear(_ animated : Bool) {
        super.viewDidDisappear(animated)
        callback?()
    }
    

    或在任何其他任意位置。

  • 在第一个视图控制器中实现prepare(for并设置回调

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       guard segue.identifier == "showDamageReportSegue" else { return }
       let destination = segue.destination as! ShowDamageReportController // change that to the real class
       destination.callback = {
           self.performReservationEndingSequence() 
       }
    }
    

【讨论】:

    【解决方案2】:

    写在视图控制器的viewDidDisappear事件中。

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("ViewController Dismissed")
    }
    

    编辑:对于要在特定转场上执行的某些代码,请使用带有触发转场标识符的准备委托方法,并且它应该在触发转场时执行:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier  == "SomeViewController" {
          print("Segue triggered for SomeViewController")
        }
    }
    

    【讨论】:

    • 但该函数应在特定场合调用,viewDidDisapear 将始终运行
    • @FinleySiebert 立即查看答案
    【解决方案3】:

    performSegue 之前调用了一个prepareForSegue 方法,你可以在那里调用你的函数。并检查是否 segue.identifier == "yourIdentifier" ,然后只调用该函数,否则不要

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "yourSegueIdentifier" {
            self.performReservationEndingSequence() // call the function
        } else {
            print("dont call the function")
        }
    }
    

    【讨论】:

      【解决方案4】:

      你可以试试swift的方法:

      viewDidDisappear()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多