Ios 用touchesBegind动作对UIBarButtonItem进行子类化

Ios 用touchesBegind动作对UIBarButtonItem进行子类化,ios,iphone,cocoa-touch,swift,uibarbuttonitem,Ios,Iphone,Cocoa Touch,Swift,Uibarbuttonitem,我正在尝试创建一个子类uibarbuttoneim,我可以在故事板/xib中使用它,在那里可以听到触摸开始的动作(在触摸按钮时播放按钮声音)。以下是我得到的: class UIAudibleBarButtonItem : UIBarButtonItem { override init() { super.init() target = self action = "touchesBegan:" } required

我正在尝试创建一个子类
uibarbuttoneim
,我可以在故事板/xib中使用它,在那里可以听到触摸开始的动作(在触摸按钮时播放按钮声音)。以下是我得到的:

class UIAudibleBarButtonItem : UIBarButtonItem {
    override init()     {
        super.init()
        target = self
        action = "touchesBegan:"
    }

    required init(coder aDecoder:NSCoder) {
        super.init(coder: aDecoder)
    }

    func touchesBegan(touches:NSSet, withEvent event:UIEvent) {
        AudioManager.instance.playButtonSound()
    }
}
但是它不起作用,即不调用touchsbegind。我需要做什么改变才能让这一切顺利进行

更新:

class UIAudibleBarButtonItem : UIBarButtonItem {
    override init() {
        super.init();
        setup();
    }

    override init(barButtonSystemItem systemItem: UIBarButtonSystemItem, target: AnyObject?, action: Selector) {
        super.init(barButtonSystemItem: systemItem, target: target, action: action);
        setup();
    }

    override init(image: UIImage?, landscapeImagePhone: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
        super.init(image: image, landscapeImagePhone: landscapeImagePhone, style: style, target: target, action: action);
        setup();
    }

    override init(image: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
        super.init(image: image, style: style, target: target, action: action);
        setup();
    }


    override init(title: String?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
        super.init(title: title, style: style, target: target, action: action);
        setup();
    }

    override init(customView:UIView) {
        super.init(customView: customView);
        setup();
    }

    required init(coder aDecoder:NSCoder) {
        super.init(coder: aDecoder);
        setup();
    }


    private func setup()
    {
        target = self;
        action = "buttonPressed:";
        println("setup()");
    }


    func buttonPressed(sender:AnyObject)
    {
        AudioManager.instance.playButtonSound();
        println("buttonPressed()");
    }
}

UIBarButtonItem
不是一个
UIView

如果您想实现类似的效果,请创建一个按钮,听触摸该按钮(使用
addTarget:…
touchesbeated
),然后使用
initWithCustomView
从该按钮创建条形按钮项

编辑:

根据声音的确切播放时间,还有一种可能性。如果要在按下并释放后播放声音,只需将上述代码修改为:

action=“按钮按下:”
...

按下func按钮(发件人:AnyObject)

如果您使用swift,这里有一种检测以下操作的简单方法。你所要做的就是在你的故事板上连接这个类,点击你的工具栏按钮,你会看到动作火

以后谢谢我

class MVBarbuttonItem: UIBarButtonItem {

    override func awakeFromNib() {
        self.action = #selector(MVBarbuttonItem.didTapButton)
    }

    @objc func didTapButton() {

    }

}

我假设您在故事板中将
uiaudiblebarbuttonim
作为自定义类提供,而不是将这一行放在类
@objc(uiaudiblebarbuttonim)
的正上方,然后看看它是否有效


这就是我的工作

点击并检查哪个视图正在处理触摸。但这只在程序上起作用?不适用于故事板/Xib文件,对吗?@Avalon请参阅我的编辑。如果你需要在用户触摸按钮时立即播放声音,你需要用很难的方法。谢谢你的编辑,但它不起作用。buttonPressed()不会被调用。除了处理程序名称不同之外,这与我上面的代码有什么不同?编辑:实际上初始化器根本不会被调用。但是编码初始化被调用了!但是,即使在将这两行代码放入coderinit之后,它也不起作用。它没有太大的区别,它只有正确数量的参数。是否执行
action=“buttonPressed:”
行?编辑:然后将这两个目标行和操作行也放在另一个init中(或者创建一个
commonInit
函数,并从两个init调用它)好的,我覆盖了所有的初始化器,只是为了确保在测试它时会明确调用commonInit方法。但按下的按钮永远不会被调用。请参见上面我的更新代码。