iOS - 显示在子控制器上的导航栏,隐藏在父控制器上

时间:2013-08-14 01:30:34

标签: ios uinavigationcontroller uinavigationbar

我已经实现了一个搜索表单的自定义版本,其行为很像带有作用域栏的UISearchBar(但实际上是出于UI原因而以编程方式拼凑在一起)。屏幕加载TextField,您在TextField中点击,导航栏在屏幕上显示动画,文本字段向上移动,并显示分段控件以过滤结果。

无论如何,这一切都有效,但当我点击其中一个搜索结果时,我的代码会推送一个新的ViewController。问题是新控制器在没有导航栏的情况下被推送(因为我在切换到搜索状态时使用了[[self navigationController] setNavigationBarHidden:YES animated:YES])。

我可以显示导航栏,因为新的ViewController被推送,甚至在转换到新的ViewController时显示动画 - 但所有这些解决方案看起来都很笨拙。我希望它像使用UISearchBar(实际上更像是电子邮件应用程序)一样工作,因为恢复的导航栏似乎只是从右侧滑入,就像它是子视图控制器的一部分一样。

我希望有一个简单的解决方法......谢谢

1 个答案:

答案 0 :(得分:5)

对于任何人来说,解决方案是让您的控制器成为UINavigationController的代表,然后在您的委托方法中显示或隐藏导航栏。

您的控制器需要实施协议:

@interface MYSearchController() <UINavigationControllerDelegate>

然后在-(void)viewDidLoad中将您的控制器指定为委托:

[self navigationController].delegate = self;

最后,实现这样的方法:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if(viewController == self)
    {
        if(_searchState && ![self navigationController].navigationBarHidden)
        {
            [[self navigationController] setNavigationBarHidden:YES animated:YES];
        }
    }
    else
    {
        if([self navigationController].navigationBarHidden)
        {
            [[self navigationController] setNavigationBarHidden:NO animated:YES];
        }
    }
}