Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Xcode(swift)-如何在展开段后执行代码_Ios_Xcode_Swift_Storyboard_Segue - Fatal编程技术网

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

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

我从第一幕到第二幕表演了一段。然后我从场景2返回到场景1。我如何不仅将数据从场景2传递到场景1,而且在场景1中检测我从场景2返回的数据并在场景1中执行代码


在安卓系统中,我使用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()
before
delegate.controller2DidReturn()
将执行此任务,如果我实现了您提供的代码,那么在
SourceViewController
s
viewwillbeen
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)
    }
}