从子视图控制器中隐藏超级视图控制器UINavigationBar?

时间:2011-06-14 18:00:10

标签: iphone objective-c uinavigationbar subview forward-declaration

我正在构建一个具有由UINavigationController控制的多个屏幕的大型分层iPhone应用程序。其中一个屏幕能够以两种不同的格式显示内容(我使用IB创建的UITabBar在它们之间切换),我构建了这个屏幕,其中的视图添加了一个基于活动的子视图(从nib文件加载)标签

这些子视图中的每一个都包含一个搜索栏,需要在点击导航栏时将其推开。导航栏只能从子视图的superview的控制器访问,所以我在每个子视图的控制器中添加了superview的控制器类的前向声明。加载子视图时,会设置其“superViewController”属性。

通常,每个搜索栏会根据需要自动隐藏导航栏,但我需要自己实现此功能,因为栏位于搜索栏上方的视图中。我试过使用

尝试这样做
[self.superViewController hideNavBar];

中的

- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView

方法,其中“hideNavBar”在superViewController.m中定义如下:

-(void)hideNavBar {
    [self.navigationController setNavigationBarHidden:TRUE animated:TRUE];
}

我也试过用

直接隐藏吧台
[self.superViewController.navigationController setNavigationBarHidden:TRUE animated:TRUE];

在这两种情况下,酒吧都没有任何改变。我是否必须告诉导航栏以某种方式更新?有没有更好的方法来实现我想要的功能?

我知道前向声明工作正常,因为我可以使用

将新视图推送到navigationViewController
 NewViewController *newViewController = [[NewViewController alloc] initWithNibName:@"NewView" bundle:nil];
 [self.superViewController.navigationController pushViewController:newViewController animated:YES];
 [newViewController release];

提前致谢, Julian Ceipek

如果重要,导航栏设置为半透明,以便子视图位于栏下方。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用模态视图控制器?根据每个选择,如果将模态视图控制器推到视图上,它将自动隐藏导航栏。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

本质上,它是一个用于临时接受用户数据的屏幕。如果你实现它,它会在进入视图时自动隐藏导航栏,因为它由提供它的视图控制器所拥有,而不会被推送到导航控制器堆栈。