从带有搜索栏的表格单元格创建模式视图时,无法在导航栏中创建后退按钮

Posted

技术标签:

【中文标题】从带有搜索栏的表格单元格创建模式视图时,无法在导航栏中创建后退按钮【英文标题】:Unable to create a back button in the navigation bar when creating a modal view from a table cell with a search bar 【发布时间】:2011-12-21 15:38:38 【问题描述】:

我正在创建一个字典应用程序。它本质上是一个标签栏应用程序,一个标签用于字典查找,另一个标签用于语法页面等。

字典查找选项卡顶部有一个 UISearchBar,下面有一个 UITableView,在用户输入搜索词时显示结果。

当用户点击结果中的一行时,我想打开一个显示完整字典条目的详细视图。我的理解是,最好在顶部有一个导航栏,并带有一个返回按钮以返回搜索。

我为此创建了一个新的视图控制器,并将一个导航栏和一个文本视图放入 nib 文件中。但是,我无法让“后退”按钮出现在 Interface Builder 中,以后也不会自动出现。

为了让新视图出现,我使用以下代码:

- (void)tableView:(UITableView *)tableView
   didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    dictEntryViewController *entryView = [[dictEntryViewController alloc]
       initWithNibName:@"dictEntryViewController" bundle:nil];

    [self presentModalViewController:entryView animated:YES];

这个新视图的滑动很漂亮,但是导航栏没有返回按钮。作为一个临时解决方案,我在新视图中创建了一个普通按钮,基本上是这样做的:

[self dismissModalViewControllerAnimated:YES];

...这很好用,但我认为使用导航栏进行导航会更自然。

我感觉我的问题是,只有当您将新视图推送到现有视图上时,后退按钮才会出现,其中两个视图共享一个导航控制器。但是,我无法将导航栏添加到我的搜索视图中,因为该部分屏幕已被搜索栏占用。

可能我不应该为此使用模态视图控制器,但它似乎工作得很好,当我尝试一些替代方法(例如 pushViewController)时,它也没有使后退按钮出现。

感谢您在这件事上的帮助。我一直在寻找解决方案很长时间,但大多数解决方案似乎都涉及在表格视图顶部添加导航栏,在这种情况下我无法做到。

【问题讨论】:

这两个答案都解决了你的问题吗? 【参考方案1】:

要获得返回按钮,您需要使用UINavigationController,或者创建自己的按钮图形。但是,我建议您将look at the docs 用于UISearchDisplayController,并将其与UINavigationController 结合使用。

使用UISearchDisplayController,当您在搜索栏中点按时,它会移到导航栏顶部上方。然后,当您选择一行并将详细视图控制器推送到导航堆栈时,视图控制器将通过后退按钮滑入。

UISearchDisplayController 启动和运行需要一点工作,但最终结果(IMO)是值得的。

您应该可以在 IB 中进行设置。在您的主 NIB 中拖入 UINavigationController,并将其根视图控制器设置为您的列表视图控制器。在列表视图控制器(可能是UITableViewController 的子类)的NIB 中,将搜索栏和搜索显示控制器拖入表格视图顶部,然后将其全部连接起来。您必须编写用于过滤结果集的代码,但我猜您已经这样做了。

【讨论】:

谢谢。我关注了您的链接,但我并不完全清楚如何将 UISearchDisplayController 与 UINavigationController 结合起来。我会在 Interface Builder 中只创建 UINavigationController,然后以编程方式创建 UISearchDisplayController 吗?【参考方案2】:

如果您已经在您的应用程序中实现了导航控制器并且能够导航到下一个屏幕......那么它非常棘手。

你确定,你已经设置了导航栏标题,如果没有,那么:

- (void)viewWillAppear:(BOOL)animated 

    [super viewWillAppear:animated];

    self.title =@"App Name";

现在,棘手的部分,只需将导航栏标题设置为返回,您将在下一个视图中获得返回按钮。

- (void)tableView:(UITableView *)tableView
   didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    dictEntryViewController *entryView = [[dictEntryViewController alloc]
       initWithNibName:@"dictEntryViewController" bundle:nil];

    self.title =@"Back";

    [self.navigationController pushViewController:entryView animated:YES];
    [entryView release];

导航控制器和 PresentModalView 控制器都以不同的方式工作,您的想法是正确的。如果是导航,您可以使用堆栈并在应用程序中维护导航,而对于 PresentModalView,它从头开始,就像一个新视图 &你可以在同一个内实现 NavigationController。

【讨论】:

以上是关于从带有搜索栏的表格单元格创建模式视图时,无法在导航栏中创建后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

TableView返回视图时隐藏在搜索栏下的第一个单元格

无法从自定义表格视图单元格按钮中删除行

当按钮覆盖在表格视图顶部时,如何防止表格视图单元格注册点击?

带有静态单元格的 UITableViewController 显示为空白

点击时表格视图单元格分隔线消失

搜索处于活动状态并推送到下一个视图控制器时出现导航栏问题