1

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

  • 在Popover 子类的initor方法中,您直接 alloc-init a ,如建议here。这个方法有点笨拙,虽然它显示得很好,但如果弹出框是 UITableViewController,你必须弄乱一堆东西来确保你刚刚添加的导航栏不会与你的一个单元格重叠。 viewDidLoadUINavigationBar

  • 或者,很多帖子建议UINavigationController在显示弹出框之前创建一个,如下所示

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

4

3 回答 3

2

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

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

您似乎对弹出框和弹出框根视图控制器之间的关系有些困惑...

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

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

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

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

于 2013-08-22T20:10:59.050 回答
2

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

创建一个UINavigationController然后嵌入您想要呈现的控制器是要走的路。

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

  • UIPopoverController是一个结构,它显示了一个现有UIViewController的覆盖样式。UIPopoverController它本身甚至不是UIViewController. 这个名字具有误导性。
  • 所以UIPopoverController托管另一个控制器。在您的情况下,我们让它托管一个UINavigationController.
  • UINavigationController是 的子类UIViewController。它是一个容器控制器,可以处理一堆UIViewControllers.
  • 在那个堆栈上,我们压入一个UIViewController:你想要显示和装饰的那个UINavigationBar。由于先生UINavigationController带有内置UINavigationBar,他是我们的朋友。

不需要子类化UIPopoverController。您只需保留一个对它的静态引用,这样您就可以关闭当前打开的弹出框,以防您想要呈现另一个。

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

于 2013-08-22T20:12:49.420 回答
0

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

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

于 2013-08-22T20:18:59.037 回答