将弹出框添加到当前导航控制器层次结构

Posted

技术标签:

【中文标题】将弹出框添加到当前导航控制器层次结构【英文标题】:Adding Popover to current Navigation Controller hierarchy 【发布时间】:2013-08-22 20:03:46 【问题描述】:

我在这里看到了很多关于将UINavigationBar 添加到UIPopoverController 的问题。我见过的所有示例都遵循以下两种模式之一:

在 Popover 子类的initviewDidLoad 方法中,你直接分配初始化一个UINavigationBar,as suggested here。这个方法有点笨拙,虽然它显示得很好,但如果弹出框是一个 UITableViewController,你必须弄乱一堆东西来确保你刚刚添加的导航栏不会与你的一个单元格重叠。

另外,很多帖子建议在显示弹出框之前创建一个UINavigationControlleras shown here。

但是,使用第二种方法,弹出框不是新创建的导航控制器中唯一的控制器吗?如果我从中呈现弹出框的视图本身已经在导航控制器中,那么弹出框将不会在同一个导航控制器中,对吗?似乎更合适的做法是将正在创建的弹出框添加为导航控制器中已经存在的另一个控制器(并且呈现弹出框的控制器已经是其中的一部分)。那可能吗?或者是否有理由为什么弹出框的导航控制器需要独立于呈现控制器的导航控制器?还是我在这里完全错过了什么?

【问题讨论】:

【参考方案1】:

你有很多问题,年轻的天行者。 :)

创建一个UINavigationController,然后嵌入您想要展示的控制器是可行的方法。

不要对这里涉及的所有控制器感到困惑:

UIPopoverController 是一个结构,它以类似覆盖的样式显示现有的 UIViewControllerUIPopoverController 本身甚至不是UIViewController 的子类。该名称具有误导性。 所以UIPopoverController 托管另一个控制器。在您的情况下,我们让它托管一个 UINavigationControllerUINavigationControllerUIViewController 的子类。它是一个容器控制器,可以处理UIViewControllers的堆栈。 在该堆栈上,我们推送一个UIViewController:您要显示并用UINavigationBar 装饰的那个。由于 UINavigationController 先生在 UINavigationBar 中进行了构建,因此他是我们的朋友。

没有必要继承UIPopoverController。您只需保留一个对它的静态引用,这样您就可以关闭当前打开的弹出框,以防您想展示另一个。

从哪里展示 UIPopoverController 并不重要。它将永远是一个弹出窗口。即使从现有的 UINavigationController 呈现。仅当您使用 presentViewController: 时,您才会获得不同的结果,具体取决于您所呈现的控制器(模态或压入堆栈顶部)。

【讨论】:

我明白了。我在想UINavigationController 作为一个容器,UIPopoverController 作为一种特殊的UIViewController——我从来没有意识到继承是如何在那里工作的——谢谢。我认为我的主要问题是我没有将弹出框视为容器本身,而是将其视为一种特殊的UIViewController,它不会占据整个屏幕。在阅读了您的答案和其他人之后,我知道弹出框 一个容器,所以一切都更有意义。【参考方案2】:

弹出框不会是新创建的导航控制器中唯一的控制器吗?

不,弹出框将包含导航控制器,而导航控制器将仅包含其根视图控制器(否则会直接将其作为根添加到弹出框)。

你似乎对popover和popover根视图控制器之间的关系有些困惑……

弹出框不会在同一个导航控制器中,正确

是的,正确。弹出框实际上是一个浮动在所有其他视图之上的窗口

或者我在这里完全错过了什么?

也许... 弹出框通常用于显示模态、瞬态和小于全屏尺寸的内容。将导航控制器放入弹出框并向其添加视图是正常的方法。

【讨论】:

我明白了。我正在考虑将 UINavigationController 作为容器对象,而将弹出框视为将进入容器的东西。但听起来popover 容器,我将普通UIViewControllers 放入(包括UINavigationControllers)。决定将UIViewController 放入弹出框会使其脱离呈现控制器所属的导航层次结构。【参考方案3】:

向弹出框添加导航栏并不难。导航栏只是另一个常规视图。这也意味着使用UITableViewController 时,导航栏将与表格视图重叠,因为UITableViewControllerview 属性只返回控制器的tableView 属性。如果要在表格视图上方添加导航栏,但不与表格视图重叠,请使用常规 UIViewController 并以正常方式添加导航栏和表格视图。 UITableViewController 仅应在该视图控制器中的 only 视图是表格视图时使用。

话虽如此,我同意其他人的观点,即仅使用导航控制器而不使用其导航功能是最常见的方法。

【讨论】:

以上是关于将弹出框添加到当前导航控制器层次结构的主要内容,如果未能解决你的问题,请参考以下文章

UIPopoverController?在弹出框控制器外点击时无法关闭

没有箭头无法定位弹出框

iPad可以将导航控制器放在弹出框内吗?

在屏幕之间导航

将工具栏添加到导航视图控制器的正确方法是啥?

UISplitViewController 弹出框为空白