【问题标题】:UINavigationBar inside UITableViewControllerUITableViewController 内的 UINavigationBar
【发布时间】:2014-01-21 09:57:38
【问题描述】:

我有一些要显示的静态单元格,所以我有一个 UITableViewController。此场景中还有一个 NavigationBar,顶部包含一些按钮。设置如下所示:

如果我有一个包含 UITableView 的 UIViewController,设置将如下所示:

所以,问题是:

  • 为什么在使用 UITableViewController 时导航栏必须嵌入到 UITableView 中? (我试过把它放在其他地方,但 IB 不让我这样做)
  • 我知道 UITableView 是 UIView 的子类,但是层次结构中最顶层的元素不是 View(而是 TableView)可以吗?

谢谢。

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    您不应该将您的UINavigationBar 放在您的UITableView 中。您应该将UITableViewController 放入UINavigationController,因为这将为您提供UINavigationBar。

    因此,如果您在情节提要中选择 UITableViewController,则可以从编辑器菜单中选择嵌入 -> 导航控制器。这才是正确的做法。

    【讨论】:

      【解决方案2】:

      在 iOS 中有两种使用 UINavigationBar 的方法:

      • 嵌入在 UINavigationController 中(推荐)
      • 作为独立对象

      对于您的特定情况,我建议您将UITableViewController 设置为rootViewController 的UINavigationController。这样,您将自动获得一个导航栏,您可以根据需要对其进行自定义。在典型的用户体验中,当您点击某些表格视图行时,一个新的视图控制器将被推送到导航堆栈上,因此您可能最终还是需要导航控制器。

      如果您决定将导航栏用作独立对象怎么办?这很好,您可以在视图层次结构中将其用作普通的UIView,但您需要创建另一个实现UINavigationBarDelegate 协议的对象并将其设置为导航栏的delegate 属性。如果您使用UINavigationController,则已经为您设置和配置了委托。您还需要使用pushNavigationItem:animated: 和popNavigationItemAnimated: 方法向导航栏添加/删除导航项(UINavigationItem 的实例)。

      关于视图层次结构的问题,您可以在需要UIView 的任何地方使用UITableView。唯一需要注意的是,UITableView 本身就是一个视图层次结构,可能会稍微限制您的布局。

      【讨论】:

        【解决方案3】:

        UITableViewController 的工作方式是它的根视图是 UITableView。所以没有办法将 UINavigationBar 放在 UITableView 之外的任何地方。

        我倾向于从不使用 UITableViewController,因为它并不能真正给你太多。

        如果您特别想使用 UITableViewController,我认为在表格视图中设置导航栏不会有任何实际问题。您只需要确保在表格视图上设置 contentInset,以便导航栏不会阻止内容。虽然这样做似乎有点落后。

        我的建议是只使用带有导航栏和表格视图的普通 UIViewController。

        如果您确实需要功能导航,则需要将 UITableViewController 放在 UINavigationController 中。

        希望这会有所帮助:)

        如果还有什么不清楚的,请告诉我。

        【讨论】:

        • 一般你不会想这样做。如果您想要导航栏,请使用 UINavigationController,即使您不打算推送其他控制器。
        • 如果您不想要导航,并且您知道您永远不会想要它,我认为没有任何理由不这样做。 UINavigationController 不会给你任何东西,除了 UIKit 元素标准的额外怪癖:P
        • 你所说的怪癖是什么?使用 UINavigationController 来包含 UINavigationBar 几乎总是更好,除非您计划进行一些 UINavigationController 不允许的特殊自定义,这里不会出现这种情况。此外,与带有嵌入式 UITableView 的 UIViewController 相比,使用 UITableViewController 有很多好处,并且这种方法需要使用 UINavigationController 才能正确获取 UINavigationBar。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 2013-12-29
        • 2019-12-07
        • 2013-10-09
        • 1970-01-01
        相关资源
        最近更新 更多