iOS - 在子控制器上显示的NavigationBar,隐藏在父控制器上

Mic*_*rne 2 uinavigationbar uinavigationcontroller ios

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

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

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

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

Mic*_*rne 5

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

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

@interface MYSearchController() <UINavigationControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

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

[self navigationController].delegate = self;
Run Code Online (Sandbox Code Playgroud)

最后,实现这样的方法:

- (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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)