如何完全覆盖导航栏的后退按钮操作?

Posted

技术标签:

【中文标题】如何完全覆盖导航栏的后退按钮操作?【英文标题】:How can I completely override the navbar's back button action? 【发布时间】:2019-08-05 21:56:34 【问题描述】:

基本上我的问题是我正在尝试创建一个抽屉,因为 ios/Swift 似乎没有用于此的本机对象。由于我不记得的原因,我决定为此使用导航控制器,认为我可以覆盖后退按钮及其操作以将此导航栏变成抽屉。虽然我已成功将后退按钮的图像/文本更改为看起来像“汉堡”(抽屉图标),但我不知道如何成功阻止按钮将我们带回,而是让它打开/关上我的抽屉。

感谢任何建议,包括采取完全不同的方法来创建它的建议。

以下是具有我试图覆盖的后退按钮的页面的控制器。你可以在 viewDidLoad() 中看到我调用了 prepareDrawerPage(),它是我在另一个文件中的助手。这个定义也可以在下面看到。

class CreateListingController: UIViewController 
    let DRAWER_OPEN = CGFloat(0)
    var DRAWER_CLOSED: CGFloat = 0  // -1 * width of drawer

    @IBOutlet var navItem: UINavigationItem!
    @IBOutlet var drawerView: UIView!
    @IBOutlet var drawerViewLead: NSLayoutConstraint!

    override func viewDidLoad() 
        super.viewDidLoad()
        DRAWER_CLOSED = UIScreen.main.bounds.width * -1 * drawerViewLead.multiplier
        drawerViewLead.constant = DRAWER_CLOSED
        prepareDrawerPage(controller: self, title: "PBX - Create a Listing")
    


    @IBAction func flipMenu(_ sender: UIBarButtonItem) 
        if (drawerViewLead.constant == DRAWER_OPEN)
            drawerViewLead.constant = DRAWER_CLOSED
            UIView.animate(withDuration: 0.2, delay: 0.0, options: .curveEaseOut, animations: 
                self.view.layoutIfNeeded()
            )
         else 
            drawerViewLead.constant = DRAWER_OPEN
            UIView.animate(withDuration: 0.2, delay: 0.0, options: .curveEaseIn, animations: 
                self.view.layoutIfNeeded()
            )
        
    


prepareDrawerPage():

func prepareDrawerPage(controller: UIViewController, title: String) 
    let blank = UIImage()
    controller.navigationController?.navigationBar.backIndicatorImage = blank
    controller.navigationController?.navigationBar.backIndicatorTransitionMaskImage = blank
    controller.title = title

上述方法在我们还没有使用导航栏的主页上运行良好。然而,一旦我们点击创建列表页面,尽管在 BarButtonItem(后退按钮)和 CreateListingController(flipMenu 函数)之间链接了一个操作,但点击该按钮仍会将我们带回家。

【问题讨论】:

为什么不隐藏导航栏并在视图中添加按钮来处理导航 【参考方案1】:

您可以在导航栏上添加自定义按钮。

override func viewDidLoad() 
    ...
    self.navigationItem.hidesBackButton = true
    let newBackButton = UIBarButtonItem(image: YourImage, style: .plain, target: self, action: #selector(back(sender:)))
    self.navigationItem.leftBarButtonItem = newBackButton
    ...


@objc func back(sender: UIBarButtonItem) 
    // Perform your custom actions
    // ...
    // Go back to the previous ViewController
    // self.navigationController?.popViewController(animated: true)

【讨论】:

以上是关于如何完全覆盖导航栏的后退按钮操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 pushViewController 创建的导航栏的功能

如何设置 UIViewController 显示在导航栏的后退按钮上?

处理来自操作栏的向上导航,如后退导航。如何?

使用底部导航时删除应用栏的后退按钮 - 颤动

iOS - 只显示后退按钮而不显示导航栏的正确方法是啥?

从带有搜索栏的表格单元格创建模式视图时,无法在导航栏中创建后退按钮