在UISearchDisplayController选择之后保持UINavigationController的navigationBar隐藏

pep*_*ppy 16 iphone iphone-sdk-3.0 uisearchdisplaycontroller

我有UISearchDisplayController一个设置UITableViewController其嵌套在一个UINavigationController.当选择单元格时,UITableView's didSelectRowAtIndexPath触发方法,将新视图推送到父导航控制器.此新视图应在导入栏中隐藏导航栏.

[[self navigationController] setNavigationBarHidden:YES animated:NO];
Run Code Online (Sandbox Code Playgroud)

我在didSelectRowAtIndexPath方法中使用此行来隐藏导航栏.如果选择的行不使用搜索控制器,但在选择搜索结果时被覆盖,则此方法可以正常工作.似乎在UISearchDisplayController选择行之后的某个时候取消隐藏navigationBar是正确的.

如果我将setNavigationBarHidden调用移动到目标视图的viewWillAppear方法中,结果是类似的.我可以通过将隐藏调用置于其中来使其工作viewDidAppear,但这会产生一种非常尴尬的过渡效果,这种效果会让人觉得有些不合时宜.我想在新视图滑到屏幕之前使navigationBar已经隐藏.

有谁知道导航栏的取消隐藏在哪里,和/或我可以覆盖此行为的任何方式?

SMS*_*dat 6

这可能不是最优雅的解决方案,但我相信它完全符合您的要求.我遇到了类似的问题,我的解决方案是使用隐藏导航栏的方法,该方法在延迟0秒后调用,如下所示.

调用的方法是:

-(void) hideNavBar {
    if (self.navigationController.navigationBar.hidden == NO)
    {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在viewDidLoad方法中,我有以下内容:

[self performSelector:@selector(hideNavBar) withObject:nil afterDelay:0.0];
Run Code Online (Sandbox Code Playgroud)

这可以在一瞬间移除并移除导航栏.如果您想要动画,可以修改延迟时间,或者在延迟后删除它.我试过[self hideNavBar],但这根本不起作用,所以坚持我上面的内容.

希望这会有所帮助,如果有人有更优雅的解决方案,我很感兴趣!


小智 1

遇到了同样的问题,设法通过这个丑陋的黑客让它顺利工作:

- (void) viewWillDisappear: (BOOL) animated 
{
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
        self.navigationController.navigationBar.tintColor = nil;        
    }

    [super viewWillDisappear: animated];
}


- (void) viewWillAppear: (BOOL) animated 
{       
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    }

    [super viewWillAppear: animated];
}
Run Code Online (Sandbox Code Playgroud)