【问题标题】:iOS - NavigationBar showing on child controller, hidden on parent controlleriOS - NavigationBar 显示在子控制器上,隐藏在父控制器上
【发布时间】:2013-08-14 01:30:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 获得所需行为的一种方法是将新的 UIViewController 简单地嵌套在一个完全独立的 UINavigationController
  • 这是一个不错的想法,如果我想不出别的东西,值得追求。问题是我没有在新 ViewController 的导航栏中获得“返回”按钮来返回搜索(至少不是没有一些额外的摆弄,我有点希望避免这种情况)。跨度>
  • 也许,虽然“额外的摆弄”可能非常少(基本上是一个班轮)。

标签: ios uinavigationcontroller uinavigationbar


【解决方案1】:

对于遇到此问题的任何人,解决方案是让您的控制器成为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];
        }
    }
}

【讨论】:

  • 我正在使用 Xcode 5.1/iOS7 解决这个问题,在我的情况下 setNavigationBarHidden 被忽略。似乎有些东西可能发生了变化,委托被触发但视图没有变化,由于使用搜索显示控制器对表格视图进行过滤而仍然隐藏。它为我指明了正确的方向,所以 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多