传统上,通过调用prepareForSegue
将数据传递给子控制器,例如,当单击表格单元格时。
在iOS 7中,似乎有一种新的导航习惯用法,您可以在其中拖动屏幕的左边缘以返回导航堆栈。看起来当你刚刚开始手势时,子视图被移除并显示父视图,但是如果你通过不拖动足够取消它,它将被取消,子视图快照回到原位,但是没有prepareForSegue
电话。此时子视图中的数据项为nil
,这使我认为它已重新创建。
如何正确地将数据传递给子视图控制器,这些控制器既适用于segue又适用于此导航习惯用法?
答案 0 :(得分:3)
你被拖拽拖拽的视图控制器错了,但事实并非如此。在开始拖动时调用viewWillDisappear,如果取消,则调用viewWillAppear和viewDidAppear,但不调用viewDidLoad或dealloc,因此不会创建新的控制器。如果要将数据传递回执行拖动时显示的控制器,则应使用委托协议。您可以将该控制器设置为执行原始推送时推送的控制器(或前进到第二个控制器的segue)的委托。此外,将这些控制器称为父控制器和子控制器并不正确 - 它们都是导航控制器的viewControllers数组中的控制器。这两个控制器中任何一个的父节点是导航控制器。
答案 1 :(得分:0)
实际原因与视图生命周期完全无关,但传递给详细视图的数据项存储为弱引用。
NSArray*
属性中。nil
项。解决方案:将详情视图中的引用更改为strong
。