Ios 添加自定义视图不工作的UIBarButtonim目标 你好,

Ios 添加自定义视图不工作的UIBarButtonim目标 你好,,ios,swift,xcode,Ios,Swift,Xcode,我在向UIBarButtonItem添加自定义操作时遇到问题 目标未调用 有人看到问题了吗 let navBarMapImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 22, height: 22)) navBarMapImageView.contentMode = .scaleAspectFit navBarMapImageView.image = image navBarMapImageView.

我在向UIBarButtonItem添加自定义操作时遇到问题
目标未调用
有人看到问题了吗

    let navBarMapImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 22, height: 22))
    navBarMapImageView.contentMode = .scaleAspectFit
    navBarMapImageView.image = image
    navBarMapImageView.isUserInteractionEnabled = true
    navBarMapImageView.target(forAction: #selector(openMaps), withSender: self)
    let navBarMapButton = UIBarButtonItem(customView: navBarMapImageView)

感谢您的帮助您正在将目标添加到
UIImageView
,它不工作,请检查下面的代码

    let btn1 = UIButton(type: .custom)
    btn1.setImage(UIImage(named: "imagename"), for: .normal)
    btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn1.addTarget(self, action: #selector(openMaps), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)

    self.navigationItem.setRightBarButtonItems([item1], animated: true)

为什么不使用UIButton并按照此线程中的建议将其指定为bar button项:


将目标设置为
navBarMapButton
,而不是
navBarMapImageView

我想添加不同的方法

您可以创建一些自定义栏项目类,并为customView编写特定的初始值设定项。比如,

fileprivate class BarButtonItem: UIBarButtonItem {

    @objc func buttonAction()

    override init() {
        super.init()
    }

    convenience init(customView: UIControl) {
        self.init()
        self.customView = customView
        customView.addTarget(self, action: .onBarButtonAction, for: .touchUpInside)
    }

fileprivate extension Selector {
    static let onBarButtonAction = #selector(BarButtonItem.buttonAction)
}
通过这种方式,你甚至可以在你的按钮动作中添加闭包

var actionCallback: ( () -> Void )?
    @objc func buttonAction() {
        actionCallback?()
    }

为什么要使用UIImageView,而不是使用UIButton。是的,好问题,我不知道为什么使用按钮肯定是更好的方法:-因为UIImageView不是控件,所以不能向其中添加控件事件的目标。
var actionCallback: ( () -> Void )?
    @objc func buttonAction() {
        actionCallback?()
    }