在iOS7中取消交互式弹出手势时如何将数据传递给子控制器?

时间:2013-11-16 07:14:19

标签: ios objective-c uinavigationcontroller ios7

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

在iOS 7中,似乎有一种新的导航习惯用法,您可以在其中拖动屏幕的左边缘以返回导航堆栈。看起来当你刚刚开始手势时,子视图被移除并显示父视图,但是如果你通过不拖动足够取消它,它将被取消,子视图快照回到原位,但是没有prepareForSegue电话。此时子视图中的数据项为nil,这使我认为它已重新创建。

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

2 个答案:

答案 0 :(得分:3)

你被拖拽拖拽的视图控制器错了,但事实并非如此。在开始拖动时调用viewWillDisappear,如果取消,则调用viewWillAppear和viewDidAppear,但不调用viewDidLoad或dealloc,因此不会创建新的控制器。如果要将数据传递回执行拖动时显示的控制器,则应使用委托协议。您可以将该控制器设置为执行原始推送时推送的控制器(或前进到第二个控制器的segue)的委托。此外,将这些控制器称为父控制器和子控制器并不正确​​ - 它们都是导航控制器的viewControllers数组中的控制器。这两个控制器中任何一个的父节点是导航控制器。

答案 1 :(得分:0)

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

  1. 在我的代码中,列表视图将其数据保存在NSArray*属性中。
  2. 在转换时,详细视图使用来自所述数组的项目初始化并存储在弱属性中。
  3. 启动弹出手势时,会显示列表视图。在我的代码中,当显示列表视图时,它的项目列表被重新加载,在子视图中自然地使引用归零。
  4. 取消手势时,详细视图将显示为不带segue,并显示nil项。
  5. 解决方案:将详情视图中的引用更改为strong