停止导航栏与表格一起滚动

Posted

技术标签:

【中文标题】停止导航栏与表格一起滚动【英文标题】:Stopping navigation bar from scrolling with table 【发布时间】:2013-05-13 10:15:19 【问题描述】:

我有一个UITableViewController,它成功地在表格视图中列出了从 CoreData 实体获取的数据。

我想在顶部有一个导航栏,有几个按钮可以导航,但是当我添加导航栏时,它似乎位于表格内,位于所有列表下方,因此在浏览时会随着表格滚动表格列表。

因为它是UITableViewController,所以我无法让表格区域看起来更小,所以我不知道如何在表格之外添加导航栏。

关于如何将导航栏固定到位以使其不会移动的任何建议。

这里是用来设置导航栏的代码:

- (void)viewDidLoad


 UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0, 1024,44)];
 UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:@"Observation details"];
 [navBar pushNavigationItem:navItem animated:NO];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(backButton)];
navItem.leftBarButtonItem = backButton;
UIBarButtonItem *detailsButton = [[UIBarButtonItem alloc] initWithTitle:@"Observation Details" style:UIBarButtonItemStyleBordered target:self action:@selector(detailsButton)];
navItem.rightBarButtonItem = detailsButton;
 [self.view addSubview:navBar];

【问题讨论】:

你在使用界面生成器吗? 使用故事板??我应该以编程方式执行此操作吗? 你是如何添加导航栏的,它是什么类型的 UI 项?系统提供的标准导航栏根本不应该滚动。 @Hermann 是的,导航栏是一个视图,如果您将视图用作任何表格的 headerView,它将随表格一起滚动。 我试过拖动它并以编程方式编写它。无论哪种方式,它都位于表格中,因此可以滚动。 【参考方案1】:

不要将导航栏拖放到表格视图上。这样您就可以将该视图(导航栏)设置为表格视图的标题。

要做你想做的事,最简单的方法是使用导航控制器,将表格视图作为它的 rootTableView。

myNavController = [[UINavigationController alloc] initWithRootViewController:myVC];

[self presentViewController:myNavController ...

您也可以在没有导航控制器的情况下使用导航栏。为此,您必须在顶部设置一个带有导航控制器的视图,并在视图的其余部分设置一个表格视图。

【讨论】:

@RichardGriffiths:发布代码你是如何以编程方式进行的。 @Richard 如果你使用 Story Board,你只需要包含一个导航控制器。这真的很简单。如果您想以编程方式执行此操作,则必须声明一个变量或属性以保留导航控制器。我将编辑我的答案,向您展示如何做到这一点。 非常感谢您的帮助。你能看到上面的回复吗?我现在有一个导航控制器,可以在其中显示表格,但仍然无法让导航栏正常运行! EUREKA - 最终如此简单。添加了导航控制器,连接到导航视图,将用于填充表格的代码添加到表格视图中,并且它第一次工作。非常感谢 - 我已经搞砸了好几个月了!!【参考方案2】:

有几种方法可以实现这一点。我尝试根据您当前的经验水平来描述我认为最简单的一种。

使用单独的视图控制器创建一个新的空视图。 向类型容器视图的该视图添加两个子视图。这些视图旨在承载具有自己的视图控制器的视图。其中一个容器位于顶部,具有导航栏的大小并包含导航栏等。 为此,您可以创建一个单独的视图控制器。但是,我看不出为什么不能是同一个视图控制器。 (文件在 IB 中的所有者) 它很可能是一个单独的实例/类。那取决于你。

剩余的视图被第二个容器视图占据。这个包含一个UITableView,其中一个UITableViewController(-子类)是文件的所有者。

除非您更熟悉视图层次结构和视图控制器层次结构,否则您不应该打破表格视图控制器和表格视图之间具有 1:1 关系的模式(由默认的 sceleton 代码和教程等给出)。 UITableViewController 有一个 view 属性,就像每个 UIViewController 一样。但是对于UITableViewController,它必须是UITableView,仅此而已。标准的UITableViewController 无法将UIView 处理为view 属性,该属性包含表视图和其他视图作为同级视图。另外,就其滚动行为等而言,向表格视图添加更多子视图并不是一个好主意。

通过将它们分开,您可以处理表格,并且仍然可以直接使用教程代码示例,而且您可以在顶部有一个完全不受表格影响的导航栏。

但是,我应该提到,通过使用适当的导航控制器,您可以更轻松地完成所有这些工作。这将免费引入您的导航栏。你必须有充分的理由不这样做。

【讨论】:

非常感谢您为此付出的时间 - 谢谢。我正在尝试导航控制器方法,因为每个人都说它是如此简单。我让表格视图正常工作,但由于某种原因,当应用程序运行时导航栏根本不显示。我是导航控制器的新手,我不确定是否需要两个视图(一个导航和一个表格)。我正在阅读它,但一无所获。这里的互联网非常差意味着也没有视频访问。无论如何,导航栏不显示可能有一些简单的原因吗? 我现在注意到,一旦我使用 segue 将表格链接到上一个视图中的按钮,表格视图上的导航栏就会消失!! 非常感谢您的帮助。见下文。 为迟到的回答道歉。对,你带来了一个导航控制器,在其中显示你的第一个视图控制器,它会照顾导航栏。自然,您的视图部分会随着条形的大小而变小。只要你使用 push segues,一个新的导航栏就会始终显示当前导航视图的标题(如果有的话)。并且后退按钮将带有 previos 视图控制器的名称,除非您更改它。您只需要一个导航控制器。如果您需要访问它,请在任何视图控制器中使用 self.navigationController。

以上是关于停止导航栏与表格一起滚动的主要内容,如果未能解决你的问题,请参考以下文章

iOS:滚动表格视图时隐藏和显示自定义导航栏

单击时使导航栏折叠/关闭

导航栏与状态栏

在 iOS 7 中让导航栏与状态栏重叠

让导航栏与iOS 7中的状态栏重叠

如何修复表格视图的搜索栏与状态栏重叠