iOS Xcode(swift)-如何在展开段后执行代码
我从第一幕到第二幕表演了一段。然后我从场景2返回到场景1。我如何不仅将数据从场景2传递到场景1,而且在场景1中检测我从场景2返回的数据并在场景1中执行代码iOS Xcode(swift)-如何在展开段后执行代码,ios,xcode,swift,storyboard,segue,Ios,Xcode,Swift,Storyboard,Segue,我从第一幕到第二幕表演了一段。然后我从场景2返回到场景1。我如何不仅将数据从场景2传递到场景1,而且在场景1中检测我从场景2返回的数据并在场景1中执行代码 在安卓系统中,我使用startActivity和onActivityResult来实现这一点。您可以这样做: class SourceViewController: UIViewController { var didReturnFromDestinationViewController = false @IBAction func
在安卓系统中,我使用startActivity和onActivityResult来实现这一点。您可以这样做:
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
}
}
}
像另一个答案所建议的那样引入
Bool
状态是非常糟糕的,必须尽可能避免,因为这会大大增加应用程序的复杂性
在许多其他模式中,解决此类问题最简单的方法是将委托
对象传递给控制器2
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()
}
}
并且是软件错误的最大来源。我遇到的问题是,我试图在放松阶段结束后显示一个警报对话框。因此,我的视图控制器2执行了到视图控制器1的展开顺序。我发现,在unwind segue方法之后运行的代码在View Controller 2关闭之前运行,因此当我尝试显示警报对话框时,它会在View Controller 2关闭后立即消失 如果其他解决方案对你不起作用,那就照我做的做。我在我的类中添加了一个ViewWillAspect覆盖,并在那里取消了父控制器,然后添加了警报对话框的代码。为了确保ViewWillDisplay在第一次显示View Controller 1时没有显示警报对话框,我设置了一个if语句,检查我在类中声明并设置为“”的变量的名称。然后在视图控制器2中,我将变量中的一些文本传递回视图控制器1,因此当if语句运行时,它会测试变量不等于“”,当它发现不等于“”时,代码就会运行。在我的例子中,变量名为“firstname”
你说我从第二场回来是什么意思?过渡完成了吗?我的意思是我已经使用segue从场景2返回到场景1。委派是更好的模式。我支持你。但在这种情况下,使用简单的放松序列到底有什么不同?对我来说,听起来他需要知道当
SourceViewController
再次出现时,应用程序是否从DestinationViewController
返回…@AndréSlotta首先,你可以完全控制调用方法的确切时间unwindSegue
是不确定的,因为它是UI,不是你调用这个方法。但是如果——这也是我从他的问题中理解的——他需要知道在转换完成后是否从DestinationViewController
返回SourceViewController
?@AndréSlotta调用self.parentViewController.dismissViewController()
beforedelegate.controller2DidReturn()
将执行此任务,如果我实现了您提供的代码,那么在SourceViewController
sviewwillbeen
和viewdidbeen
get call之前调用委托方法,这就是我想要强调的……;)
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)
}
}