touchesBegan时UIBarButtonItem的扩展

时间:2018-10-18 10:36:37

标签: ios swift uibarbuttonitem

我实际上正在与ReachabilityManager类进行连接管理。

我创建了一个祝酒词,显示何时断开和恢复连接。 我还创建了两个扩展(UIButton和UISwitch),并在其上覆盖了func touchesBegan,以检查并播放按钮/开关的动作或仅显示带有错误消息的吐司(并且不播放按钮/开关的选择器)。

这里是我的UIButton扩展了解:

extension UIButton {
    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if ReachabilityManager.shared.reachability.connection == .none {
            ReachabilityManager.shared.customConnectionToast(ToastStyle.connectionLost.applyStyle(),
                                  description: NSLocalizedString("no_connection_error_message", comment: ""))
        } else {
            sendActions(for: UIControlEvents.allTouchEvents)
        }
    }
}

我现在需要为UIBarButtonItem创建相同的扩展,但是问题是此对象没有touchesBegan动作,而且我不知道如何制作类似于UIbutton和UISwitch扩展的东西。关于为什么要这样做的另一个信息是,我无法重构该应用程序的所有barbutton项(这将花费我2个星期)。为此,我必须找到一种扩展或其他方法,但绝对是通用的解决方案。

如果有人有任何想法,我将不胜感激。

预先谢谢你。

问候,

1 个答案:

答案 0 :(得分:1)

一种快速的解决方案:使用UIButton并将其设置为UIBarButtonItem,然后可以将上面发布的类别(UIButton的扩展名)用于作为barButtonItem的新按钮。

像这样:

internal lazy var button_Close: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(.close, for: .normal)
        button.imageEdgeInsets = UIEdgeInsets.init(top: 0, left: -30, bottom: 0, right: 0)
        button.addTarget(self, action: #selector(back(_:)), for: .touchUpInside)
        return button
    }()

将其设置为barButton项:

override func viewDidLoad() {
    super.viewDidLoad()

    let barButton = UIBarButtonItem(customView: self.button_Close)
    self.button_Close.frame = CGRect(x: 0, y: 0, width: 55.0, height: 44.0)
    let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
    if #available(iOS 11.0, *) {
        negativeSpacer.width = -30
    }
    self.navigationItem.leftBarButtonItems = [negativeSpacer, barButton]
}

我希望这会有所帮助!