将Popover添加到当前导航控制器层次结构

时间:2013-08-22 20:03:46

标签: ios objective-c uinavigationcontroller uipopovercontroller

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

  • 在Popover子类的initviewDidLoad方法中,直接为UINavigationBar分配初始化as suggested here。这个方法有点hacky,虽然很好地显示,如果popover是一个UITableViewController,你必须搞乱一堆东西,以确保你刚刚添加的导航栏不与你的一个单元格重叠。

  • 或者,很多帖子建议在呈现弹出窗口as shown here之前创建UINavigationController

但是,使用第二种方法,popover不是新创建的导航控制器中唯一的控制器吗?如果我的观点是我提出的popover本身已经在导航控制器中,那么popover不会在同一个导航控制器中,对吗?似乎更合适的做法是将弹出窗口添加为已存在的导航控制器中的另一个控制器(以及呈现弹出窗口的控制器已经是其中的一部分)。那可能吗?或者有没有理由为弹出窗口的导航控制器需要独立于呈现控制器的导航控制器?或者我完全错过了什么?

3 个答案:

答案 0 :(得分:2)

  

不知道popover是新创建的导航控制器中唯一的控制器吗?

不,popover将包含导航控制器,导航控制器将只包含其根视图控制器(否则它将直接添加到弹出窗口作为其根目录)。

你似乎对popover和popover根视图控制器之间的关系感到有点困惑......

  

popover不会在同一个导航控制器中,正确

是的,没错。 popover实际上是一个浮动在所有其他视图之上的窗口

  

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

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

答案 1 :(得分:2)

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

创建UINavigationController,然后嵌入您想要呈现的控制器即可。

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

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

无需继承UIPopoverController。你只需保留一个静态引用,这样就可以解除当前打开的popover,以防你想要呈现另一个。

从哪里呈现UIPopoverController并不重要。它永远是一个流行音乐。即使从现有的UINavigationController呈现。只有当你使用presentViewController:时,你才会得到不同的结果,具体取决于你呈现的控制器(模态或推到堆栈顶部)。

答案 2 :(得分:0)

向弹出窗口添加导航栏并不简单。导航栏只是另一个常规视图。这也意味着使用UITableViewController,导航栏将与表视图重叠,因为UITableViewController的{​​{1}}属性只返回控制器的view属性。如果要在表视图上方添加导航栏,而不使其与表视图重叠,请使用常规tableView并以正常方式添加导航栏和表格视图。只有在该视图控制器中 only 视图是表格视图时,才应使用UIViewController

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