是否可以将导航控制器提供给另一个导航控制器?

时间:2017-03-15 14:10:53

标签: ios navigation

我有4个viewcontrollers。 A,B,C,D。

每个人都有自己的navA,navB,navC,navD。

故事板上的4个集群。

(navA - > A)(navB - > B)(navC - > C)(navD - > D)

他们没有连接到另一个群集。 他们每个人都有"按钮" IBAction触发并转到另一个集群。 假设clusterA是一个起点,我想呈现ViewController [navB]

这就是里面 - (IBAction)gotoCVCNav

  UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  UINavigationController* nav = [sb     instantiateViewControllerWithIdentifier:@"cvcNav"];
  [self presentViewController:nav animated:YES completion: nil];

问题是这个问题导致了这一点。

http://imgur.com/a/ppEo5

我想知道什么是正确的方式来呈现B viewcontroller并正确地从内存中删除一个viewcontroller。

2 个答案:

答案 0 :(得分:1)

第一个控制器中仅使用一个导航控制器,然后使用segue 连接所有其他控制器。导航控制器保持控制器的形式为堆栈,因此除非有任何此类要求,否则不需要多个导航控制器。现在只需要 B控制器 添加segue到B并选择PRESENT / SHOW选项。要返回从B到A ,您可以 POP 视图控制器或 DISMISS 视图控制器。如果您 POP控制器从堆栈中移除,如果您关闭控制器,它就会落后控制器A

答案 1 :(得分:0)

在这个特定的场景中(这是很常见的,代表了现实世界中的大多数场景),你不需要多个导航控制器。

有时候,你需要在另一个上面添加一个UINavigationController,但目前情况并非如此,所以我不会详细介绍这一点。

您正在做的事情是从根本上在您的应用中有4种不同的“方式”。但实质上,你需要一种方法,分4步。

所以不要做

(navA --> A) (navB --> B) (navC --> C) (navD --> D)

你想做的是

Nav  ->  A (root of Nav)  ->  B  ->  C  ->  D

我看到你正在使用Storyboard,这使它变得更容易。

拖动&使用右clic(或Ctrl + clic)将控制器A连接到故事板中的控制器B.为B做同样的事情 - > C和C - > d。

您会看到显示的链接。你可以用它们来重命名它们,给它们相关的名字。这些被称为 segue

我通常使用功能名称命名为“FromXXXToYYYY”。比如“FromContactsToDetail”

可以(但不是必须)从UIViewController链接到UIViewController,使用故事板中的小黄圈图标,或者只是通过拖放控制器。但是 也可以从UIButton拖到UIViewController。只需从UIButton开始执行相同的连接(使用右clic拖动或使用ctrl + clic拖动)。

唯一的区别是,如果从按钮拖动,按钮将执行操作。如果从控制器拖动,则必须手动在代码中键入。有时你只需要从按钮开始,有时不需要。

如果您使用按钮执行此操作,则表明您的工作已完成。

如果您从故事板中执行此操作,则需要致电

PerformSegue(self, "SegueNameYouEnteredInStoryboard")

您可以在IBAction

中拨打此电话

如果您只在IBAction中执行performSegue,那么这可能是删除IBAction并仅使用情节提要连接的标志。

iOS将管理导航栏,后退按钮以及所有这些。

另外,要回答您的具体问题:

  

我想知道什么是正确的方式来呈现B viewcontroller并正确地从内存中删除一个viewcontroller。

如果你想导航回A,你需要在内存中。请按照我的回答中的说明操作。 如果您需要返回该控制器,通常您会遵循另一种架构。

你要做的是让你的导航控制器以你的root作为B.并且由于A只是临时的(例如,它可能是登录屏幕),你可以在A上加载 modally ,仅当用户注销时,例如。

这样做很简单,只需实例化你的UIViewController并使用presentViewController来呈现它。

请注意,如果您的登录过程由多个屏幕组成,则可以呈现UINavigationController。整个导航将位于根导航的顶部,用户可以在登录中来回切换,当它全部结束时,您只需在导航控制器上调用dismissViewController即可将其删除,并且所有将删除导航堆栈内的控制器。在我的示例中,所有登录屏幕都将被清除,最后您将使用root中的控制器“B”进行导航。

因此,如果这是一个类似的情况,而A只是暂时的,但B是你的重要内容,那么你应该让你的B已经在A下,A是可见的和最顶层的,那么只需要在必要时解雇A和B会出现。