iOS Xcode(swift) - 如何在展开segue后执行代码

时间:2015-11-26 09:30:28

标签: ios xcode swift storyboard segue

我从场景1到场景2执行一个segue。然后我从场景2返回到场景1.我如何不仅将场景2中的数据传递到场景1,还在场景1中检测到我从场景1返回场景2并在场景1中执行代码?

在Android中,我使用startActivity和onActivityResult执行此操作。

3 个答案:

答案 0 :(得分:7)

介绍$BITRISE_SOURCE_DIR状态,就像其他答案的建议非常糟糕一样,必须尽可能避免,因为它会大大增加您应用的复杂性。

在许多其他模式中,解决此类问题的最简单方法是将Bool对象传递给delegate

Controller2

States are evil并且是软件错误的最大单一来源。

答案 1 :(得分:2)

你可以这样做:

class SourceViewController: UIViewController {
  var didReturnFromDestinationViewController = false

  @IBAction func returnToSourceViewController(segue: UIStoryboardSegue) {
    didReturnFromDestinationViewController = true
  }

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if didReturnFromDestinationViewController == true {
      // reset the value
      didReturnFromDestinationViewController = false

      // do whatever you want
    }
  }
}

答案 2 :(得分:0)

我遇到的问题是,在放松结束后,我试图显示一个警报对话框。因此,我的View Controller 2对View Controller 1执行了取消同步设置。我发现在调用unwind segue方法之后运行的代码在关闭View Controller 2之前运行,因此当我尝试显示警报对话框时,它将View Controller 2被解雇后立即消失。

如果其他解决方案对您不起作用,请执行我的操作。我在类中添加了viewWillAppear替代,并在那里取消了父控制器,然后在此之后为我的警报对话框添加了代码。为了确保viewWillAppear在第一次显示View Controller 1时没有显示警告对话框,我设置了一条if语句来检查我在类中声明并设置为等于“”的变量的名称。然后,在View Controller 2中,我将变量中的一些文本传递回View Controller 1,因此,如果if语句运行,它将测试不等于“”的变量,如果发现不相等,则运行代码。在我的情况下,该变量名为“名字”。

override func viewWillAppear(_ animated: Bool) {

    if firstname != "" {
        self.parent?.dismiss(animated: true, completion: nil)
        //CustomViewController?.dismiss(animated: true, completion: nil)
        let alertController = UIAlertController(title: "Hello", message: "This is a test", preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "Close Alert", style: .default, handler: nil)
        alertController.addAction(defaultAction)
        present(alertController, animated: true, completion: nil)
    }
}