防止UISearchDisplayController隐藏导航栏

had*_*zoo 65 iphone uinavigationcontroller iphone-sdk-3.0 uisearchdisplaycontroller

每当用户开始编辑UISearchDisplayController搜索栏时,搜索控制器就会变为活动状态,并在显示搜索表视图时隐藏视图的导航栏.是否可以防止UISearchDisplayController隐藏导航栏而不重新实现它?

sti*_*igi 60

我刚刚调试了一下UISearchDisplayController并发现它在UINavigationController上调用一个私有方法来隐藏导航栏.这发生在-setActive:animated:.如果您继承UISearchDisplayController并使用以下代码覆盖此方法,则可以通过伪造将其隐藏来阻止navigationBar被隐藏.

- (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
    if(self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible) {
        [self.searchBar becomeFirstResponder];
    } else {
        [self.searchBar resignFirstResponder];
    }   
}
Run Code Online (Sandbox Code Playgroud)

如果这对您有用,请告诉我.我也希望在未来的iOS版本中不会破坏...仅在iOS 4.0上测试过.

  • 你是怎么做到这一点的?我想改变搜索的行为,以便它保持表视图变暗,直到用户点击搜索按钮,你的调试解决方案似乎是一种非常优雅的方式来实现这一点. (2认同)
  • 很好的答案!但我不得不添加self.searchContentsController.edgesForExtendedLayout = UIRectEdgeBottom; 对于iOS 7 (2认同)
  • @stigi:我知道答案已有几年了,我只想留下一个提示,如果有人在iOS 7上与此斗争:) (2认同)

小智 52

最简单的解决方案,没有黑客攻击.

@interface MySearchDisplayController : UISearchDisplayController

@end

@implementation MySearchDisplayController

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    [super setActive: visible animated: animated];

    [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 同意,这是最简单的解决方案.仅用于完成:如果您正在使用xib,则选择搜索显示控制器,点击身份检查器并将类更改为MySearchDisplayController. (9认同)
  • 您是否尝试从结果导航到详细控制器并返回?这打破了我的视图布局.iOS 6.1 (5认同)

Ren*_*ené 50

UISearchControlleriOS 8中引入的新类具有一个属性hidesNavigationBarDuringPresentation,如果要保持导航栏可见(默认情况下它仍然是隐藏的),您可以将其设置为false.

  • 这是iOS 8 UISearchController的正确答案!! (8认同)

joe*_*ick 28

以上答案对我来说不太适合.我的解决方案是欺骗UISearchDisplayController认为没有UINavigationController.

在视图控制器中,添加此方法

- (UINavigationController *)navigationController {
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说没有任何副作用,尽管看起来像是一个非常糟糕的主意......如果你需要进入导航控制器,请使用[super navigationController].

  • @KhantThuLinn使用`[super navigationController]`而不是`self.navigationController` (2认同)

Pet*_*ics 10

从iOS 8.0开始,通过将UISearchController's self.searchController.hidesNavigationBarDuringPresentation属性设置为false 可以实现相同的行为.

Swift中的代码如下所示:

searchController.hidesNavigationBarDuringPresentation = false
Run Code Online (Sandbox Code Playgroud)


小智 9

尝试这种方式不同,没有子类化UISearchDisplayController.在你为UISearchDisplayController设置委托的UIViewController类中,实现searchDisplayControllerDidBeginSearch:并添加使用

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

对我来说诀窍,希望有所帮助.

  • 当用户关注文本字段时,导航栏会再次上下滑动.动画:不,它会弹回原位.两种选择都很糟糕. (5认同)