【问题标题】:What is the best way to keep the state of a modal UIViewController?保持模态 UIViewController 状态的最佳方法是什么?
【发布时间】:2015-04-28 04:18:57
【问题描述】:

我很难用一个标题来概括我的问题,所以我会在这里尽量说清楚。

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

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

要返回 vc1,我只需按一个返回 UIButton 我在 @IBAction 所在的位置:

@IBAction func returnToMainView(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}

我希望当我再次回到vc2时,我第一次选择的段被再次选择。

我的解决方案是什么?

我是否应该继续使用dismissViewControllerAnimated 方法并使用委托方法来保存选择的索引段。然后当我回到 vc2 时,在 segue 调用 vc2 时传递选定的索引段?

或者有没有比dismissViewControllerAnimated更好的方法来保持我的vc2的状态?

希望我已经足够清楚了。

更新

这里有一些关于我的案例的更多信息。

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

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    我为此使用NSUserDefaults。所以如果我打开另一个 ViewController,我会在需要的地方保存我的 UIViews 的所有重要设置。

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

    NSUserDefaults.standardUserDefaults().setInteger(segmentedControl.selectedSegmentIndex, forKey: "yourSwitch")
    

    然后,在 ModalViewController 的 viewWillApear 方法中,调用 NSUserDefaults 并加载所有设置:

    var selectedIndex = NSUserDefaults.standardUserDefaults().integerForKey("yourSwitch")
    

    然后在viewDidAppear 方法中调用这些值:

    segmendedControl.selectedSegmentIndex = selectedIndex
    

    【讨论】:

    • 它仍然适用。因为您可以在 AppDelegate 方法中删除 NSUserDefaults。例如,如果您重新启动应用程序,您可以在 applicationDidFinishLaunchingWithOptions 方法中调用它并从 userdefaults 中删除所有键。检查这个问题如何做到这一点:stackoverflow.com/questions/6797096/…
    【解决方案2】:

    IMO 如果它真的只是您想要保留的一个 segmented_control 索引,请将其索引保存在您以前的 viewController 中,并在您通过 prepareForSegue: 方法呈现它的任何时候传递它。任何其他事情都将是矫枉过正。

    【讨论】:

    • 如果我理解你的提议,这将 VC2 与 VC1 紧密耦合对吗?
    • 是的,因为 vc1 存储了 vc2 的 segmentedControl 状态。
    • 所以我们可能不想这样做。编写测试将非常具有挑战性。
    【解决方案3】:

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

    1. 委托模式。您可以让 VC1 实现 VC2Delegate 协议,该协议本质上充当回调
    2. 您可以在 VC1 上设置 VC2 上的块属性,以执行一些操作以在扩充 segmentedControl 时更改 VC1 的状态。
    3. 正如提到的其他一些答案,您可以设置一些数据模型,例如 Core Data 或 NSUserDefaults
    4. 您可以使用 NSNotifications。根据我的经验,其他工程师可能很难理解正在发生的事情。

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,有几种方法可以做到这一点。另一种方法是让 VC2 保持活动状态,而不是在您关闭它时将其释放。您可以通过在 VC1 中为它创建一个属性来做到这一点,并且仅在您第一次呈现 VC2 时实例化它;您必须在代码中呈现它,而不是使用 segue,因为 segue 总是实例化新的控制器。

      【讨论】:

      • 谢谢,这可能正是我想要的。在性能方面,它或多或少相同?任何提示如何“呈现”视图控制器?
      • @Nico,就性能而言,由于您要保持视图控制器处于活动状态,它将使用更多内存,但如果它没有很多图像,那么内存损失是相当可观的低的。此外,如果用户经常来回走动,那么保持控制器活动与多次创建新控制器之间没有太大区别。要呈现一个视图控制器,你可以使用 presentViewController:animated:completion: 你应该从阅读“iOS 视图控制器指南”中知道。如果您还没有阅读,请阅读。
      猜你喜欢
      • 2012-01-08
      • 1970-01-01
      • 2015-07-02
      • 2018-08-14
      • 2021-11-02
      相关资源
      最近更新 更多