我有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];
问题是这个问题导致了这一点。
我想知道什么是正确的方式来呈现B viewcontroller并正确地从内存中删除一个viewcontroller。
答案 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会出现。