iOS Xcode(Swift)- 如何在取消连线后执行代码

8

我从场景1切换到场景2,然后从场景2返回到场景1。我如何不仅将数据从场景2传递到场景1,还要在场景1中检测到我已经从场景2返回并执行场景1中的代码?

在Android中,我使用startActivity和onActivityResult来实现这个功能。


你说的“我从场景2返回”是什么意思?是指转换已经完成了吗? - André Slotta
我的意思是,我使用了一个segue从场景2返回到了场景1。 - Questioner
3个回答

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

程序错误的主要源头是“国家”,它是IT技术中最大的问题。


1
委托是更好的模式。我同意你的观点。但是,与使用简单的取消转场有什么不同呢?对我来说,听起来像他需要知道应用程序是否从“DestinationViewController”返回,当“SourceViewController”再次出现时... - André Slotta
1
@AndréSlotta 首先,你可以完全控制方法何时被调用。unwindSegue是非确定性的,因为调用该方法的是UI而不是你。 - Daniel Shin
1
但是,如果 - 这是我从他的问题中理解到的 - 他需要知道 SourceViewController 是否在转换完成后从 DestinationViewController 返回了呢? - André Slotta
@AndréSlotta 在 delegate.controller2DidReturn() 之前调用 self.parentViewController.dismissViewController() 就可以完成任务。 - Daniel Shin
@AndréSlotta 只是为了记录,我并不争论使用 unwindSegue 是好还是坏,我的意思是为这样微不足道的工作引入状态是非常糟糕的。 - Daniel Shin
1
如果我实现了你提供的代码,那么委托方法会在 SourceViewControllerviewWillAppearviewDidAppear 方法之前被调用 - 这就是我想要强调的全部内容... ;) - André Slotta

3
你可以像这样完成它:
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
    }
  }
}

0
我遇到的问题是,在 unwind segue 完成后,我试图显示一个警告对话框。所以我的 View Controller 2 执行了一个 unwind segue 到 View Controller 1。我发现,在调用 unwind segue 方法之后运行的代码在 View Controller 2 被解除显示之前就已经运行了,因此当我尝试显示警告对话框时,它会在 View Controller 2 被解除显示后立即消失。
如果其他解决方案对您不起作用,请像我一样做。我在我的类中添加了一个 viewWillAppear 覆盖,并在那里解除了父控制器,然后添加了我的警告对话框代码。为了确保第一次呈现 View Controller 1 时,viewWillAppear 不会显示警告对话框,我设置了一个 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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接