我从场景1到场景2执行一个segue。然后我从场景2返回到场景1.我如何不仅将场景2中的数据传递到场景1,还在场景1中检测到我从场景1返回场景2并在场景1中执行代码?
在Android中,我使用startActivity和onActivityResult执行此操作。
答案 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)
}
}