【问题标题】:Push / Pop View Controller With Navigation Bar from View Controller Without Navigation Bar从不带导航栏的视图控制器推送/弹出带导航栏的视图控制器
【发布时间】:2014-12-09 17:35:42
【问题描述】:

我正在尝试从带有隐藏导航栏的视图控制器推送带有可见导航栏的视图控制器。

我在viewWillAppear、viewDidAppear、viewWillDisappear...等中尝试了[[self navigationController] setNavigationBarHidden:YES animated:NO];的各种组合。

// First View Controller

@implementation FirstViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:YES animated:NO];

    NSLog(@"[%@ viewWillAppear]", self);
}

@end


// Second View Controller


@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[self navigationController] setNavigationBarHidden:NO animated:NO];

    NSLog(@"[%@ viewWillAppear]", self);
}

@end

没有任何效果。我还尝试了自定义代码来“动画”推送和弹出,这有效,但我失去了边缘滑动和视图平移。在我深入挖掘之前,只是想确保我没有重新发明轮子。

Starbucks 应用程序是我试图模仿的。

应用程序的根视图控制器(深色背景视图)是全屏的,请注意它没有 UINavigationBar。但是,当您点击其中一个按钮时,它会推动带有 UINavigationBar 的视图控制器(浅色背景视图)。从那里,如果您点击“后退”箭头,它会弹出导航栏的视图控制器。交互式弹出滑动手势也可以使用。

【问题讨论】:

  • 是在第二个视图中显示导航栏以便有后退按钮的唯一原因吗?还是您需要导航栏的其他内容(除了标题/副标题)?
  • 肯定需要返回按钮,但随着用户深入研究,还需要一个功能导航控​​制器/栏。
  • 啊,明白了。我要说的是,您可以使用调用 popViewControllerAnimated 的后退按钮将自定义视图添加到顶部并保持导航栏隐藏。我想您仍然可以,但我不知道随着您深入研究,事情会变得多么复杂
  • 我不确定你的问题是什么——你提到了隐藏导航栏的代码,但没有提到实际推送下一个控制器的代码。你是在调用 pushViewController:animated: 吗?
  • 如果您想在没有自动实现的返回功能的情况下滑动,请将其添加到您的 VC。我通常把它放在 viewDidLoad 中:self.navigationController.interactivePopGestureRecognizer.delegate = self;

标签: ios objective-c iphone


【解决方案1】:

无需自己编写解决方案即可。这是你要做的:

你的根视图控制器:

@implementation ViewController

....

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

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

@end

以及推送的viewController:

@implementation SecondViewController

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

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

@end

这样就可以了。它还保持交互式过渡工作;)

然而,我觉得令人不安的是,苹果根本没有记录这种类型的功能。 - 您还可以使用这些“呼叫点”隐藏和显示工具栏(在 viewWillAppear 内:)

编辑

我刚刚意识到这与您在问题中编写的代码相同。请再次测试。我 100% 确定这可行 - 我也在我的一个应用程序中使用了此功能。

另请注意,我的代码确实使用animated:animated 而不是您的animated:NO。这可能是这里的关键点:)

【讨论】:

  • “请注意,我的代码确实使用了动画:动画而不是您的动画:否。这可能是这里的关键点:)”确实是关键点。谢谢!
  • 通过animated BOOL 对我来说是一件好事。当我执行交互式(向后)弹出动画时,简单地传递 YES/NO 会导致一些奇怪的导航栏行为。
  • 如果您在UIViewController 基类上存储了BOOL navigationBarHidden 属性,那么您只需将属性设置为YES 用于隐藏它的视图控制器,并覆盖viewWillAppear 以调用@ 987654330@
【解决方案2】:

我刚刚设置了两个视图控制器来来回测试这个。

@interface VC1 ()

@end

@implementation VC1

- (void)viewDidLoad {
[super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.navigationBarHidden = YES;
}

@end

一秒钟

#import "ViewControllerTwo.h"

@interface ViewControllerTwo ()

@end

@implementation ViewControllerTwo

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = NO;
}

@end

VC1 嵌入在一个navigationController(它是应用程序的根控制器)中,带有一个导航到ViewControllerTwo 的按钮。我有一个来自 VC1 -> ViewControllerTwo 的推送,这个方法有效。当我点击按钮时,视图控制器在 ViewControllerTwo 上可见,当我按下返回时,导航栏消失了。

【讨论】:

  • 这也是我首先做的,但创意不会让它飞起来。如果从左侧滑动弹出视图控制器,导航栏会立即消失,而不是跟随视图控制器。
  • 所以为了澄清起见,问题不在于您无法摆脱导航栏,而是您希望导航栏与您的弹出视图控制器一起动画,以便它们粘在一起,对吗?
  • 正确。很抱歉造成混乱。
  • 我推荐两种方法之一。要么创建自己的导航栏框作为视图控制器的一部分,并以编程方式从 UINavigationController 触发弹出和推送(如果您仍处于开发早期,最简单的方法),或者,更复杂但更强大的路线是看看在自定义视图控制器转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多