如何使 UIBarButtonItem 在按下时执行功能?

How to make a UIBarButtonItem perform a function when pressed?

我正在尝试使用此代码制作自定义后退按钮:

let back = UIImage(named: "header_backarrow")
let backView = UIImageView(image: back)
let backItem = UIBarButtonItem(customView: backView)
navigationItem.leftBarButtonItem = backItem

我希望导航项执行此代码:

func dismissManual() {
    dismiss(animated: true, completion: nil)
}

我已经尝试了很多事情,比如遵循这个 Stack Overflow post:Execute action when back bar button of UINavigationController is pressed

我也试过把它变成navigationItem.backBarButtonItem;但是,似乎没有任何效果。有些东西显示正确的自定义图像,但不能用作按钮;另一方面,有些用作按钮,但不显示正确的图像。

有谁知道如何显示正确的图像并使项目作为按钮使用?谢谢

Swift 4.1

问题是 UIImage 没有点击识别。您必须在 backView 中添加点击手势识别器。

    lazy var singleTap: UITapGestureRecognizer = {
    let singleTap = UITapGestureRecognizer(target: self, action: #selector(tapDetected))
    singleTap.numberOfTapsRequired = 1
    return singleTap
}()

// Actions
@objc func tapDetected() {
    dismiss(animated: true, completion: nil)
}

如果您展示您的代码,并提供一些屏幕截图,如果这不能解决问题,我可以提供更多帮助。

UIBarButtonItem 的创建有误。您不需要图像视图。

按如下操作:

let back = UIImage(named: "header_backarrow")
let backItem = UIBarButtonItem(image: back, style: .plain, target: self, action: #selector(dismissManual))
navigationItem.leftBarButtonItem = backItem

@objc func dismissManual() {
    dismiss(animated: true, completion: nil)
}

注意函数必须标有@objc.

根据您的图片以及您希望它的显示方式,您可能需要按如下方式创建图片:

let back = UIImage(named: "header_backarrow").withRenderingMode(.alwaysOriginal)

另一种选择是使用图像和设置创建 UIButton 以调用您的 dismissManual 函数。使用按钮创建 UIBarButtonItem 作为自定义视图。

但是当您只有一个简单的图像或一个简单的字符串时,创建标准 UIBarButtonItem 会更容易。

按如下操作:

override func viewDidLoad() {
        super.viewDidLoad()

        let back = UIImage(named: "header_backarrow")
        let backView = UIImageView(image: back)
        backView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissManual))
        backView.addGestureRecognizer(tap)
        let backItem = UIBarButtonItem(customView: backView)
        navigationItem.leftBarButtonItem = backItem
    }

    @objc func dismissManual() {
        print("print----")
//        dismiss(animated: true, completion: nil)
    }

将手势添加到 backView 就可以了! 类似于这个问题 IOS - Swift - adding target and action to BarButtonItem's customView

let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                            style: .plain,
                                            target: self,
                                            action: #selector(menuButtonTapped))

// Adding button to navigation bar (rightBarButtonItem or leftBarButtonItem)
self.navigationItem.rightBarButtonItem = barButtonItem

 // Private action
@objc fileprivate func menuButtonTapped() { // body method here }

看看这个,可能会有帮助谢谢。