【问题标题】:How to pass data to child controller when interactive pop gesture is cancelled in iOS7?在iOS7中取消交互式弹出手势时如何将数据传递给子控制器?
【发布时间】:2013-11-16 07:14:19
【问题描述】:

传统上,数据通过调用prepareForSegue 传递给子控制器,例如,当单击表格单元格时。

在 iOS 7 中,似乎有一个新的导航习惯,您可以在其中拖动屏幕的左边缘以返回导航堆栈。似乎当您刚开始手势时,子视图被删除并显示父视图,但是如果您通过拖得不够远来取消它,它将被取消,子视图会重新定位,但是没有prepareForSegue 电话。此时子视图中的数据项是nil,这让我觉得它是重新创建的。

如何正确地将数据传递给既适用于 segue 又适用于这种导航习惯的子视图控制器?

【问题讨论】:

  • 您在传递数据方面采取了哪些方向? “新”孩子是什么意思。
  • @rdelmar 数据仍然从父级->子级传递。 “new”,因为它似乎在拖动开始时被破坏,在拖动被取消时重新创建(除了 segue 没有运行)。

标签: ios objective-c uinavigationcontroller ios7


【解决方案1】:

您对被销毁的拖动弹出的视图控制器是错误的,它不是。开始拖动时会调用 viewWillDisappear,如果取消,则会调用 viewWillAppear 和 viewDidAppear,但不会调用 viewDidLoad 或 dealloc,因此不会创建新的控制器。如果你想将数据传回拖拽时出现的控制器,你应该使用委托协议。您可以将该控制器设置为执行原始推送时被推送的那个的代表(或前进到第二个控制器的segue)。此外,将这些控制器称为父级和子级并不正确——它们都是导航控制器的 viewControllers 数组中的控制器。这两个控制器中的任何一个的父级都是导航控制器。

【讨论】:

  • 你说的有道理,我想我刚刚意识到了问题所在,确实和视图生命周期无关,而是弱引用和父视图中的数据重载。
【解决方案2】:

事实证明,实际原因与视图生命周期完全无关,而是传递给详细视图的数据项被存储为弱引用。

  1. 在我的代码中,列表视图将其数据保存在 NSArray* 属性中。
  2. 在转换时,详细视图会使用所述数组中的项目初始化并存储在弱属性中。
  3. 启动弹出手势时,将显示列表视图。在我的代码中,当显示列表视图时,它的项目列表会被重新加载,子视图中的引用自然会归零。
  4. 当手势被取消时,详细视图将呈现无segue,nil item。

解决方案:将详细视图中的引用更改为strong

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多