如何在按下时使UIBarButtonItem执行一个函数?

时间:2018-06-12 22:42:57

标签: ios swift uinavigationcontroller uinavigationitem

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

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帖子:Execute action when back bar button of UINavigationController is pressed

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

有人知道如何显示正确的图像并使该项目作为按钮工作吗?感谢。

4 个答案:

答案 0 :(得分:1)

按如下方式进行:

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

答案 1 :(得分:1)

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 }

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

答案 2 :(得分:0)

Swift 4.1

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

    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)
}

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

答案 3 :(得分:0)

您正在错误地创建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会更容易。