【问题标题】:iOS Xcode (swift) - how to execute code after unwind segueiOS Xcode (swift) - 如何在 unwind segue 后执行代码
【发布时间】:2016-02-29 07:52:52
【问题描述】:

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

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

【问题讨论】:

  • 你说的 我从场景 2 回来是什么意思?过渡完成了吗?
  • 我的意思是我已经使用 segue 从场景 2 回到场景 1。

标签: ios xcode swift storyboard segue


【解决方案1】:

你可以这样做:

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】:

    像其他答案的建议那样引入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()
      }
    }
    

    States are evil 是软件错误的最大来源。

    【讨论】:

    • 委托是更好的模式。我和你在一起。但是在这种情况下,使用简单的 unwind segue 到底有什么不同呢?对我来说,当SourceViewController 再次出现时,他需要知道应用程序是否从DestinationViewController 返回...
    • @AndréSlotta 一方面,您可以完全控制何时调用该方法。 unwindSegue 是不确定的,因为它是 UI,而不是调用该方法的您。
    • 但是如果——这就是我从他的问题中理解的——他需要知道SourceViewController是否从DestinationViewController返回过渡完成之后?
    • @AndréSlotta 在delegate.controller2DidReturn() 之前调用self.parentViewController.dismissViewController() 将完成这项工作
    • 如果我实现了你提供的代码,委托方法会被调用之前 SourceViewControllers viewWillAppearviewDidAppear 会被调用 - 这就是全部我 想强调... ;)
    【解决方案3】:

    我遇到的问题是我试图在展开转场完成后显示一个警报对话框。因此,我的 View Controller 2 对 View Controller 1 执行了 unwind segue。我发现在调用 unwind segue 方法之后运行的代码在 View Controller 2 被解除之前运行,因此当我尝试显示警报对话框时,它会View Controller 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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多