繁体   English   中英

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

[英]iOS Xcode (swift) - how to execute code after unwind segue

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

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

像其他答案一样介绍Bool状态是非常糟糕的 ,必须尽可能避免,因为它会大大增加应用程序的复杂性。

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

protocol Controller2Delegate {
  func controller2DidReturn()
}

class Controller1: Controller2Delegate {
  func controller2DidReturn() {
    // your code.
  }

  func prepareForSegue(...) {
    // get controller2 instance

    controller2.delegate = self
  }
}

class Controller2 {
  var delegate: Controller2Delegate!

  func done() {
    // dismiss viewcontroller

    delegate.controller2DidReturn()
  }
}

国家是邪恶的 ,是软件漏洞的最大单一来源。

你可以这样做:

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
    }
  }
}

我遇到的问题是我试图在展开segue完成后显示警告对话框。 所以我的View Controller 2对View Controller 1进行了展开。我发现调用unwind segue方法后运行的代码在View Controller 2被解除之前运行,所以当我试图显示一个警告对话框时,它会视线控制器2被解雇后立即消失。

如果其他解决方案不适合您,请按我的方式行事。 我向我的类添加了一个viewWillAppear覆盖并解除了那里的父控制器,然后在我的警报对话框中添加了代码。 为了确保viewWillAppear在第一次出现View Controller 1时没有显示警告对话框,我设置了一个if语句,检查我在类中声明的变量名称,并设置为等于“”。 然后在View Controller 2中,我将变量中的一些文本传递回View Controller 1,因此当if语句运行时,它会测试不等于“”的变量,当它发现它不是时,代码就会运行。 在我的例子中,变量被命名为“firstname”。

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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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