显示带有返回按钮的导航控制器

Posted

技术标签:

【中文标题】显示带有返回按钮的导航控制器【英文标题】:Show Navigation Controller With Back Button 【发布时间】:2016-08-26 23:03:26 【问题描述】:

我正在尝试以编程方式显示我已经编写好的视图,并给它一个后退按钮,以便用户可以轻松地弹回我当前的视图。这是我可以使用的唯一代码,但它没有显示后退按钮!

UIStoryboard *storyboard = self.storyboard;
UIViewController *root = [[[UIApplication sharedApplication] keyWindow] rootViewController];

UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Privacy"];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];

navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[root presentViewController:navigationController  animated:YES completion:nil];

我尝试在上面的代码中使用“根”视图控制器初始化导航控制器,然后通过 pushViewController 推送“控制器”视图控制器。当我尝试使用带有编辑堆栈跟踪的“根”进行初始化时,这会崩溃。

如何以编程方式打开带有返回按钮的视图到当前视图?

我在 *** 上到处查看,但没有解决这个微妙的场景。请帮忙!

【问题讨论】:

【参考方案1】:
    您不应使用presentViewController:,而应使用 pushViewController: 你应该推送你的 viewController 想要从当前在屏幕上的 viewController 呈现, 并且有 navigationController。 可能您的 UIWindow 对象的 rootViewController 应该是 navigationController,而该 navigationController 的 rootViewController 应该是您要从中推送的 viewController。

【讨论】:

我唯一的问题是您的答案要求我当前的视图位于导航视图控制器中。 #2 不在我们的设计中。对于我所在的视图,我不需要导航控制器,但是要呈现的视图需要导航控制器,以便它们可以返回原始页面。【参考方案2】:

要首先添加导航控制器,您必须将其放入您的 AppDelegate.m

UIStoryboard *sb=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc=[sb instantiateViewControllerWithIdentifier:@"View1"];

UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController=nav;

如果你想在点击按钮或其他东西时推送视图,你可以通过以下方式实现:-

[self.navigationController pushViewController:ViewName animated"YES];

如果你想从那个视图返回,你可以简单地通过弹出视图来实现(如果你的后退按钮):-

[self.navigationController popViewControllerAnimated:YES];

【讨论】:

我遇到的问题是我不希望我正在查看的视图位于导航控制器中。我只需要将导航控制器添加到要更改的视图中,以便他们可以单击后退按钮返回到没有导航栏的控制器。【参考方案3】:

您的代码是正确的,只需在您的 PrivacyViewController 中创建自定义后退按钮

viewDidLoad

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow"] style:UIBarButtonItemStylePlain target:self action:@selector(goPrevious)];

方法是这样的:

- (void)goPrevious 

    [self dismissViewControllerAnimated:TRUE completion:^

    ];

【讨论】:

【参考方案4】:

到目前为止,最简单的做法是将我正在使用的视图嵌入到导航控制器中。在 Interface builder 中,单击视图,然后转到 Editor -> Embed -> Navigation Controller。

从这里,很容易将导航栏本身隐藏在 -(void)viewWillAppear:animated: 中:

- (void)viewWillAppear:(BOOL)animated 
    //Hide the nav bar for the onboarding screens.
    [[self navigationController] setNavigationBarHidden:YES animated:YES];

然后是使用自动填充的后退按钮转到另一个页面的代码:

UIStoryboard *storyboard = self.storyboard;
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:identifier];
[[self navigationController] pushViewController:controller animated:YES];
[[self navigationController] setNavigationBarHidden:NO animated:YES];

【讨论】:

以上是关于显示带有返回按钮的导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

导航控制器中不显示后退按钮

导航控制器干扰 TabBar 控制器

导航控制器不显示后退按钮

导航控制器中的 UIViewController 缺少返回按钮

只有返回按钮和透明背景的导航

返回到视图控制器的导航返回按钮