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

时间:2011-12-21 15:38:38

标签: ios uitableview uitabbarcontroller uinavigationbar uisearchbar

我正在创建一个字典应用程序。它基本上是一个标签栏应用程序,其中一个选项卡用于字典查找,其他选项卡用于语法页面等。

字典查找选项卡顶部有一个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)时,它也没有显示后退按钮。

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

2 个答案:

答案 0 :(得分:0)

要获取后退按钮,您需要使用UINavigationController,或者创建自己的按钮图形。不过,我建议UISearchDisplayController使用UINavigationController,并将其与UISearchDisplayController结合使用。

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

UINavigationController启动并运行有一些工作,但最终结果是(IMO)值得。

您应该可以在IB中进行设置。在主NIB中拖动UITableViewController,并将其根视图控制器设置为列表视图控制器。在列表视图控制器的NIB(可能是{{1}}的子类)中,拖动表视图顶部的搜索栏和搜索显示控制器,并将其全部挂钩起来。你必须编写过滤结果集的代码,但我猜你已经完成了。

答案 1 :(得分:0)

如果您已在应用程序中实现了导航控制器&能够导航到下一个屏幕....然后它非常棘手。

您确定,您已设置导航栏标题,如果没有,则设置:

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    self.title =@"App Name";
}

现在,棘手的部分,只需将导航栏标题设置为Back &在这里,您将在下一个视图中获得后退按钮。

- (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 Controller以不同的方式工作,你的想法是正确的。如果是导航,你可以使用stack&在应用程序中维护导航,而对于PresentModalView,它从头开始,就像一个新的视图&你可以在同一个中实现NavigationController。