【问题标题】:dismissViewController but keep reference解除视图控制器但保留参考
【发布时间】:2013-11-12 16:12:27
【问题描述】:

假设我有一个应用程序,它基本上存在一个带有视图的 tabbarcontroller。其中一个视图有一个按钮,它显示了一个模态视图控制器。这个 viewcontroller 的目的是输入一些数据,比如名字,当按下 start 时它会开始录制,因此它还保留对时间的引用并显示录制的总时间。

(点击开始按钮后按钮变为停止按钮)

在录制过程中,用户可以单击关闭按钮,该按钮将关闭视图控制器(保存名称和录制时间等变量),应用程序将返回其带有视图的 tabbarcontroller。当用户在录制时再次按下按钮(显示模态视图控制器)时,它必须向视图控制器显示之前输入的数据(名称、录制总时间)。

所以这些数据必须在以下代码运行后保持活动状态:

- (IBAction)close:(id)sender {
     [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
}

上面的代码会关闭视图控制器,但也会破坏视图控制器中的变量。关闭视图控制器后保留输入的变量的最佳方法是什么?

tabbarcontroller 的视图是否应该对这些数据负责?或者我应该保留对我的模态视图控制器的引用并使其在后台保持活动状态?我将如何在代码中做到这一点?

最后,当用户通过单击模态视图控制器中的停止按钮并按下关闭按钮来停止录制时,当然应该销毁此视图以保留内存。

【问题讨论】:

  • 在 .h 文件中简单声明 ViewController 的对象
  • 所以基本上你是说,创建一个模态视图控制器的实例,并在关闭它时将该视图控制器设置为 nil(当然不记录)
  • 在下面查看我的答案,我在示例项目中对其进行了测试。

标签: ios objective-c uiviewcontroller uistoryboard uistoryboardsegue


【解决方案1】:

如果你想存储ViewController 的整个实例,你应该创建一个带有解除分配中止方法的单例类:

-(void)dealloc {
   abort();
}

但我认为您只想从中存储一些信息。您可以使用 viewWillDissapear 方法 ant 传递它,称为 topViewController(在基于 UINavigationController 的应用程序中)并将一些变量分配给目标。

您也可以使用单例数据模型并在您关闭控制器时为其分配值。

我建议您将 dataModel 从 ViewController 强烈分离到单独的类。

【讨论】:

  • 对,我明白你的意思。比如:有一个记录对象的模型。在录制过程中设置此模型中的数据。然后只需简单地关闭并销毁视图控制器,当它再次出现时,只需从模型中获取数据。
  • 如果要使用单例请不要在dealloc方法中放入abort(),dispatch_once是创建伪单例的标准
【解决方案2】:

实现这一目标的步骤:

  • 在 ViewController 的 .h 文件中声明模态 ViewController 的对象。
  • 在 viewDidload 中对其进行初始化。
  • 随心所欲地展示它。
  • 无论何时关闭模态视图控制器,它的变量都会保持保存。
  • 直到您重新初始化对象或弹出视图控制器。
  • 【讨论】:

      【解决方案3】:

      2 个词 - 委托模式

      把东西分开是好的。如果控制器应该创建一些数据,则使用一种方法定义协议,例如

      -(void)controller:(MYController *)controller didEnterData:(MYDataWrapper *)data;
      

      当用户点击close 时,将消息发送给代理。创建控制器时,请设置委托。很简单。

      【讨论】:

        【解决方案4】:

        您可以在视图被关闭之前使用 NSUserDefaults 存储所需的数据,并在视图加载时使用 NSUserDefaults 获取数据。

        【讨论】:

        • 不太实用,因为它还包含一个计时器,该计时器在按下开始按钮时启动。我想我正在创建一个包含我的数据的单例数据模型。
        猜你喜欢
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 2012-04-23
        • 2017-04-23
        • 2017-02-27
        • 2017-01-27
        相关资源
        最近更新 更多