2014-02-14 133 views
0

我解决可能是最有图的帮助说明了问题:我工作的一个应用程序最佳实践层次结构

|---|  |---| 
| |  | | 
| B | --> | C | 
| |  | | 
|---|  |---| 
^  | 
    |   v    
|---|  |---| 
| |  | | 
| A | --> | D | 
| |  | | 
|---|  |---| 

其中一个导航控制器, A呈现给用户。它包含一个集合视图。用户可以点击集合中的条目,并将D推入导航堆栈,或者点击按钮在集合中创建新条目。这导致模态地呈现另一个导航控制器B。作为创建条目的一部分,用户导航至推入B的导航堆栈的C。一旦用户配置了条目,我想要关闭模态呈现的控制器并直接转至D以向用户显示新创建的条目。用户不应该看到AD的转换。

如果我的解释相当缺乏,上述内容与标准日历应用程序中的流程非常相似:如果您在月视图中并创建新事件,它会以模态方式显示控制器,直接进入日视图。

C可以拨打dismissViewControllerAnimated:completion:返回A。冒着问一个主观问题的风险,在C自行解散之前是否有导致D被推到A的导航栈上的最佳做法?我可以通过B将一个代表传递给C,但是传递这样的东西感觉有点笨拙。我也考虑过使用通知,但这也不正确。也许故事板在这里会有所帮助,但是如果存在这样的事情,我更喜欢一种干净的基于代码的方法。

回答

1

我不认为你想要做什么有什么问题。

所以,你必须具有一个导航控制器作为根:

NAV1 --> A 

仅有B存在模态在所述导航控制器(B实际上是另一个导航控制器的根)

NAV1 --> A 
| 
v 
NAV2 --> B 

然后向前推Ç到第二个导航控制器上

[B.navigationController pushViewController:C ...] 

NAV1 --> A 
| 
v 
NAV2 --> B --> C 

然后当你想解雇C(和B)并回到D,首先将D推到第一个导航控制器上。您可以轻松地获得通过presentingViewController属性参照第一导航控制器:

[((UINavigationController*) C.navigationController.presentingViewController) pushViewController: D ...] 

NAV1 --> A --> D 
| 
v 
NAV2 --> B --> C 

则取消第二导航控制器:

[C.navigationController dismissViewControllerAnimated: ...] 

NAV1 --> A --> D