以编程方式创建的后退按钮未显示在导航栏中?

Posted

技术标签:

【中文标题】以编程方式创建的后退按钮未显示在导航栏中?【英文标题】:Programmatically created back button does not show up in navigation bar? 【发布时间】:2017-02-18 03:17:35 【问题描述】:

为了简单起见,由于应用程序设计的原因,我不能使用嵌入式导航控制器,而必须使用视图控制器上的手动后退按钮返回到前一个。据我所知,以前的视图控制器也以编程方式推送到这个视图控制器。所以我在这里找到了许多不同问题的按钮的一些很棒的代码,并为这个应用程序编写了它。问题是,当我运行程序时,我创建的条形按钮项没有显示出来。代码没有显示任何错误,我很困惑为什么什么都没有出现。我将包含图像和代码以使其尽可能清晰。一如既往地感谢您提供的任何帮助!!!

使用的代码:

@IBOutlet weak var roomImage: UIImageView!
@IBOutlet weak var locationLabel: UILabel!
@IBOutlet weak var roomName: UINavigationItem!

override func viewDidLoad() 
    super.viewDidLoad()

    // Back Button Code

    let backButton = UIBarButtonItem(title:"Back",style: UIBarButtonItemStyle.plain, target: self, action: #selector(DetailView.back(sender:)))
    self.navigationItem.leftBarButtonItem = backButton

    navigationItem.rightBarButtonItem = backButton
    navigationItem.hidesBackButton = false

    // Hide da tab bar

    self.tabBarController?.tabBar.isHidden = true

    // Do any additional setup after loading the view.


    // Enter data from other view controllers

    //roomName.title = stringPassed
    roomImage.image = imagePassed
    locationLabel.text = locationPassed



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.

*/

// Back Button Action

func back(sender: UIBarButtonItem) 

    if let navigationController = self.navigationController 

        navigationController.popViewController(animated: true)

    

带有导航栏的实际故事板

应用运行时

会不会是我没有做一些出口或类似的东西?谢谢!!

故事板布局

详细视图的树模型(导航栏问题)

编辑:仍然无法正常工作,但您提供的链接和想法给了我很多新的想法和选择来探索,直到出现更具体的答案。谢谢!!!

【问题讨论】:

我不会喜欢这种方式。为什么不能使用navigationController。 如果我使用导航控制器,则需要 3 个而不是 1 个,因为 3 个不同的视图控制器正在推送到这个单一视图。所有这些都植根于选项卡视图。如果您认为有更简单的方法,我会全力以赴。 @Frank_Cerny 你能展示你的故事板结构吗?您是否通过从控件拖动到 viewController 添加了 NavigationItem? 我不是 100% 确定你的意思(开发新手和学习缓慢)故事板结构就在那里,我相信我通过将它拖到导航栏上添加了一个导航项?但是,当我添加它时没有任何变化。 @Frank_Cerny 您是否正在使用 navigationController.pushViewController 移动到标题屏幕? 【参考方案1】:

删除您从“控件库”面板拖动到您的ViewControllerNavigationBar。当您使用self.navigationItem 设置navigationItem 时,它不会引用该navigationBar 项目,因为它与它没有任何联系。

当您使用navigationController?.pushViewController(myVC, animated: true) 推送您的ViewController 时,它会自动在myVC 屏幕上显示NavigationBar

【讨论】:

我按照你说的做了,并且该按钮仅在我使用推送视图并在导航控制器中显示导航栏时显示。但是,对于其他 2 个未植根于导航控制器的视图,仍然没有返回按钮。你的回答很有意义,我尽我所能来完成这项工作。此外,如果我在根植于其中的单个视图推送到 detailView 时关闭导航栏,则不会像往常一样发生任何事情。 @Frank_Cerny 如果你丢失了导航控制器,那么导航栏将不会显示。 重点是创建一个后退按钮,该按钮适用于不植根于导航控制器的视图,我可以整天使用视图控制器制作后退按钮,但该实现不适用于这个问题。您的答案仅适用于导航控制器,不幸的是这不是问题。【参考方案2】:

你能说明你是如何推送到 DetialView 控制器的吗 我以编程方式累了 像这样

func showDetialViewController()
let detialViewController = UIViewConroller()
navigationController?.pushViewController(detialViewController, animated: true)
 

【讨论】:

答案是为了回答手头的问题,而不是提出更多问题。 一个视图控制器像你说的那样推送,另外两个显示,检查上面的评论。

以上是关于以编程方式创建的后退按钮未显示在导航栏中?的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 垂直对齐导航栏中的后退按钮

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

在导航栏中的默认“后退”按钮附近添加按钮

以编程方式将按钮添加到导航栏

RightBarButtonItem 未出现在导航栏中

如何强制显示移动 Safari 底部导航栏以编程方式显示?