Ios 保持模态UIViewController状态的最佳方法是什么?

Ios 保持模态UIViewController状态的最佳方法是什么?,ios,swift,Ios,Swift,我很难用一个标题来总结我的问题,所以我会在这里澄清 我有一个UIViewController(vc1),它通过一个segue将我链接到另一个UIViewController(vc2) 在vc2中,我可以选择UISegmentedControl的一段 要返回vc1,我只需按下我在@iAction处创建的返回ui按钮: @IBAction func returnToMainView(sender: AnyObject) { self.dismissViewControllerAnimated

我很难用一个标题来总结我的问题,所以我会在这里澄清

我有一个
UIViewController
(vc1),它通过一个segue将我链接到另一个
UIViewController
(vc2)

在vc2中,我可以选择
UISegmentedControl
的一段

要返回vc1,我只需按下我在
@iAction
处创建的返回
ui按钮

@IBAction func returnToMainView(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}
我希望当我再次回到vc2时,我第一次选择的段再次被选择

我的解决方案是什么

我是否应该继续使用
dismissViewControllerAnimated
方法,并使用委托方法保存所选的索引段。然后当我回到vc2时,在调用vc2的序列中传递所选的索引段

或者有没有更好的方法来保持我的vc2的状态,而不是将
dismissViewControllerAnimated

希望我说得够清楚

更新

这是关于我案件的更多信息

在vc1中,我有一个UITableView。在每一行我都可以调用我的vc2,它将根据当然行显示信息


事实上,我想保存这个控制器的状态,只是为了应用程序的当前执行。无需保持状态

我使用的是
NSUserDefaults
。因此,如果我打开另一个ViewController,我会在需要时保存UIView的所有重要设置

在您的示例中,在关闭ModalViewController之前,您可以保存
UISegmentedControl
的状态:

NSUserDefaults.standardUserDefaults().setInteger(segmentedControl.selectedSegmentIndex, forKey: "yourSwitch")
然后,在ModalViewController的
viewWillApear
方法中,调用
NSUserDefaults
并加载所有设置:

var selectedIndex = NSUserDefaults.standardUserDefaults().integerForKey("yourSwitch")
之后,在
viewdideappear
方法中,调用以下值:

segmendedControl.selectedSegmentIndex = selectedIndex

如果它实际上只是一个要保留的分段控件索引,请将其索引保存在以前的viewController中,并在任何时候通过
prepareforsgue:
方法呈现它时传递它。任何其他事情都是多余的。

有很多方法可以做到这一点:

  • 委托模式。您可以使用VC1实现
    VC2Delegate
    协议,该协议实质上充当回调
  • 您可以从VC1在VC2上设置块属性,以在segmentedControl增强时执行某些操作来更改VC1的状态
  • 正如前面提到的一些其他答案一样,您可以设置一些数据模型,如核心数据或
    NSUserDefaults
  • 您可以使用NSN通知。根据我的经验,其他工程师很难理解发生了什么
    正如其他人指出的那样,有几种方法可以做到这一点。另一种方法是保持VC2的活力,而不是在您关闭它时让它被释放。您可以通过在VC1中为它创建一个属性来实现这一点,并且只在您第一次呈现它时实例化VC2;您必须在代码中表示它,而不是使用segue,因为segue总是实例化新的控制器。

    如果我理解您的建议,这将使VC2与VC1紧密耦合,对吗?是的,因为VC1存储VC2的分段控件状态。所以我们可能不想这样做。编写测试将是相当有挑战性的。它仍然适用。因为您可以删除AppDelegate方法中的NSUserDefaults。例如,如果重新启动应用程序,可以在ApplicationIDFinishLaunchingWithOptions方法中调用它,并从UserDefault中删除所有键。检查这个问题如何做到这一点:谢谢,这可能正是我想要的。就性能而言,大致相同吗?有没有关于如何“呈现”viewController的提示?@Nico,int性能方面,因为您让viewController保持活动状态,它将使用更多内存,但如果它没有太多图像,那么内存损失就相当低。此外,如果用户经常来回移动,那么保持控制器活动与多次创建新控制器之间没有太大区别。要显示视图控制器,请使用presentViewController:animated:completion:显示视图控制器,您应该通过阅读“iOS视图控制器指南”了解这一点。如果你还没有读过,那就读吧。