推送,弹出,呈现和关闭ViewController

最近,我发现自己处于模态呈现UINavigationController,然后将UIViewControllers推送到UINavigationController中的情况。 在最后一个UIViewController上,我有两种情况要处理:1)导航回到UINavigationController堆栈中的第一个UIViewController,以及2)关闭UINavigationController,包括UINavigationController堆栈中包含的所有推送的UIViewControllers。

经过一番尝试和错误,我决定花一些时间来了解UINavigationControllers和UIViewControllers处理导航的不同方式。

第一堂课:

必须以模态形式呈现的任何UIViewController(包括作为UINavigationControllers的UINavigationControllers的UINavigationControllers)都必须被取消

第二课:

由于UINavigationControllers将UIViewControllers保留在其堆栈中,因此它们既可以模态显示也可以通过推送呈现UIViewControllers。 从任何推入的UIViewController导航时,UINavigationControllers必须弹出 UIViewController。

第三课:

尽管可以模态地或通过推送来呈现UIViewControllers,但UIViewControllers只能呈现其他UIViewControllers。 因此,只能关闭UIViewControllers(除非它们位于UINavigationController堆栈中并且UINavigationController正在处理弹出消息-请参阅第2课)。 这就是为什么无法在UIViewController上调用popViewController的原因。

第四课:

PresentingViewController 是Apple提供的属性,可在UIViewControllers和UINavigationControllers上使用。 调用presentingViewController.dismiss(animated:completion)将关闭parentViewController呈现的所有内容parentViewController是呈现当前UIViewController的UIViewController。 因此,如果您的UINavigationController在其堆栈中具有3个UIViewControllers,则调用presentingViewController.dismiss(animated:completion)将同时关闭UINavigationController和保存在其堆栈中的3个UIViewControllers。

第五课:

同样,Apple还提供了UIViewControllers和UINavigationControllers的另一个属性( presentedViewController) 调用presentedViewController.dismiss(animated:completion)将关闭childViewControllerchildViewController是要显示的当前UIViewController。


在进行此最近的调查之前,我一直认为导航是相对基本的。 但是,当面对推入式和呈现式UIViewControllers的组合时,我意识到完全理解不同的导航模式是多么重要。

和往常一样,我希望这对您有所帮助,并且编码愉快!! 🙂